I’d like to know how I can increase the performance and efficiency of my SQL statement.
Does anyone have some ideas or advices?
DECLARE @RoleName NVARCHAR(MAX)
DECLARE @result INT
SELECT @result = COUNT(DurchlaufVorgang.Durchlaufname)
FROM DurchlaufVorgang
INNER JOIN RoleDepartment
ON DurchlaufVorgang.AbteilungID = RoleDepartment.ID
WHERE DurchlaufVorgang.Depricated = 'FALSE'
AND RoleDepartment.RoleName = @RoleName
AND RoleDepartment.Depricated = 'FALSE'
SELECT Antraege.AntragID
FROM ArtikelMitteilung,
Antraege
WHERE ArtikelMitteilung.Status = 'Opened'
AND Antraege.AntragID NOT IN
(SELECT Antraege.AntragID
FROM Vorgang,
Antraege
WHERE Vorgang.StepID IN
(SELECT DurchlaufVorgang.ID
FROM DurchlaufVorgang
INNER JOIN RoleDepartment
ON DurchlaufVorgang.AbteilungID = RoleDepartment.ID
WHERE DurchlaufVorgang.Depricated = 'FALSE'
AND RoleDepartment.RoleName = @RoleName
AND RoleDepartment.Depricated = 'FALSE')
AND Vorgang.AntragsID = Antraege.ID
GROUP BY Antraege.AntragID
HAVING COUNT(Antraege.AntragID) >= @result)
AND ArtikelMitteilung.AntragsID = Antraege.ID
GROUP BY Antraege.AntragID
I’m grateful for your help.
You’re not doing anything glaringly wrong in your query. The SQL optimizer will take a large statement like that and figure out the best way to execute it. Where you can run into problems is if your indices are fragmented or non-existent.
From SQL Server Management Studio, click on Show Execution Plan and see if it suggests any additional indices. De-fragment your indices (you can just drop and re-add them if you’re in a testing environment).
If your intuition is that a big statement is bad for performance, that should not be the case here. In fact, it should help the optimizer because it gives it more choices on how to execute it.