Hi, ik heb een stored procedure met een hele grote SELECT query waar ik een aantal waardes aan mee geef. Afhankelijk van of deze waardes ingevuld zijn of leeg zijn moet de WHERE clause van de SELECT query anders zijn.
Dit is een (heel erg
) verkorte versie:
Dit heeft als nadeel dat het 'SELECT * FROM Adres' gedeelte meerdere keren voorkomt. In dit geval is het nogal simpel, maar in mijn werkelijke query heb ik 2 'SELECT' gedeeltes die elk 11 regels beslaan met een aantal joins etc., en heb ik ook nog eens 3 variabelen (en dus 8 cases). Dat is dus vrijwel niet te onderhouden.
Nou kan ik het ook zo doen:
Maar nu vraag ik me toch af... Een stored procedure wordt door SQL Server gecompiled en geoptimaliseerd. Het eerstgenoemde stukje code zal dus vrij snel uitgevoerd worden, het hoeft maar 1 keer gecompiled en geoptimaliseerd te worden. Bij het tweede stukje code zal de dynamische query echter elke keer opnieuw gecompiled worden bij het uitvoeren van de EXEC. Hoeveel gaat dat ten koste van de performance?
Ik begrijp dat het bij deze simpele queries niet zo heel veel uitmaakt, maar de werkelijk query beslaat gemiddeld zo'n 50 regels, met twee keer 9 joins en een UNION...
Het gaat wel om een zoekfunctie, dus het hoeft ook weer niet de lichtsnelheid te behalen.
Dit is een (heel erg
code:
1
2
3
4
5
6
7
8
| PROCEDURE spTest
@Plaats as varchar(50)
AS
IF (@Plaats IS NULL) OR (@Plaats = '')
SELECT * FROM Adres
ELSE
SELECT * FROM Adres WHERE Plaats LIKE @Plaats |
Dit heeft als nadeel dat het 'SELECT * FROM Adres' gedeelte meerdere keren voorkomt. In dit geval is het nogal simpel, maar in mijn werkelijke query heb ik 2 'SELECT' gedeeltes die elk 11 regels beslaan met een aantal joins etc., en heb ik ook nog eens 3 variabelen (en dus 8 cases). Dat is dus vrijwel niet te onderhouden.
Nou kan ik het ook zo doen:
code:
1
2
3
4
5
6
7
8
9
10
11
12
| PROCEDURE spTest
@Plaats as varchar(50)
AS
DECLARE @Query as varchar(512)
SET @Query = 'SELECT * FROM Adres'
IF (@Plaats IS NOT NULL) AND (@Plaats <> '')
SET @Query = @Query + ' WHERE Plaats LIKE ''' + @Plaats + ''''
EXEC (@Query) |
Maar nu vraag ik me toch af... Een stored procedure wordt door SQL Server gecompiled en geoptimaliseerd. Het eerstgenoemde stukje code zal dus vrij snel uitgevoerd worden, het hoeft maar 1 keer gecompiled en geoptimaliseerd te worden. Bij het tweede stukje code zal de dynamische query echter elke keer opnieuw gecompiled worden bij het uitvoeren van de EXEC. Hoeveel gaat dat ten koste van de performance?
Ik begrijp dat het bij deze simpele queries niet zo heel veel uitmaakt, maar de werkelijk query beslaat gemiddeld zo'n 50 regels, met twee keer 9 joins en een UNION...
Het gaat wel om een zoekfunctie, dus het hoeft ook weer niet de lichtsnelheid te behalen.
edit:
Hmm, misschien is het afhankelijk van de database server. Ik gebruik MS SQL Server 2000.
Hmm, misschien is het afhankelijk van de database server. Ik gebruik MS SQL Server 2000.
edit:
Edit2:
Effe test op "(@Plaats IS NULL)" toegevoegd, want dat moet hetzelfde betekenen als wanneer "(@Plaats = '')".
Edit2:
Effe test op "(@Plaats IS NULL)" toegevoegd, want dat moet hetzelfde betekenen als wanneer "(@Plaats = '')".
[ Voor 16% gewijzigd door RetepV op 21-10-2003 14:26 ]
Macbook Pro