RE: TechEd Developer - Non siamo gli unici... :-D

In riferimento ai post precedenti #1 e #2.

Non voglio innescare una polemica, ma ritengo che BISOGNA usare le stored procedures, sia per ragioni di sicurezza ma anche per ragioni prestazionali. E' vero però che in alcuni casi le SPs sono molto controproducenti, ad esempio quando si vuole fare una form di ricerca che includa o escluda criteri di filtro. In questo caso infatti la struttura della query non è rigida ma dinamica e allora tanto vale usare statement sql specifici.

Ho scritto una piccola store in SQL 2005 nel database Northwind:

CREATE PROCEDURE [dbo].[GetOrdersByDate]( @StartDate datetime, @EndDate datetime) AS DECLARE @Number int SELECT @Number=COUNT(*) FROM Orders WHERE OrderDate>=@StartDate AND OrderDate<=@EndDate GO

e questo statement di prova, nel quale eseguo 10000 volte la chiamata alla SP e 10000 volte la chiamata ad un analogo statement sql. Ogni chiamata ha parametri diversi.

DECLARE @StartDate datetime DECLARE @EndDate datetime DECLARE @Time datetime DECLARE @i int DECLARE @Query VARCHAR(1000) SET @Time = GETDATE() SET @i = 0 SELECT @StartDate = '2000-01-01' SELECT @EndDate = '2010-01-01' WHILE (@i<10000) BEGIN -- Questo calcolo è inutile qui: serve per avere lo stesso contesto della -- chiamata via sql statement SET @Query ='DECLARE @Number int SELECT @Number=COUNT(*) FROM Orders WHERE OrderDate>=''' + CONVERT(VARCHAR(4), YEAR(@StartDate)) + '-' + CONVERT(VARCHAR(2), MONTH(@StartDate)) + '-' + CONVERT(VARCHAR(2), DAY(@StartDate)) + ''' AND OrderDate<=''' + + CONVERT(VARCHAR(4), YEAR(@EndDate)) + '-' + CONVERT(VARCHAR(2), MONTH(@EndDate)) + '-' + CONVERT(VARCHAR(2), DAY(@EndDate)) + '''' EXECUTE [Northwind].[dbo].[GetOrdersByDate] @StartDate ,@EndDate SET @StartDate = DATEADD(day, 1, @StartDate) SET @i = @i + 1 END SELECT 'Store procedure:' + CAST(DATEDIFF(ms,@Time,GETDATE()) AS VARCHAR(50)) SET @Time = GETDATE() SET @i = 0 SELECT @StartDate = '2000-01-01' SELECT @EndDate = '2010-01-01' WHILE (@i<10000) BEGIN SET @Query ='DECLARE @Number int SELECT @Number=COUNT(*) FROM Orders WHERE OrderDate>=''' + CONVERT(VARCHAR(4), YEAR(@StartDate)) + '-' + CONVERT(VARCHAR(2), MONTH(@StartDate)) + '-' + CONVERT(VARCHAR(2), DAY(@StartDate)) + ''' AND OrderDate<=''' + + CONVERT(VARCHAR(4), YEAR(@EndDate)) + '-' + CONVERT(VARCHAR(2), MONTH(@EndDate)) + '-' + CONVERT(VARCHAR(2), DAY(@EndDate)) + '''' EXECUTE (@Query) SET @StartDate = DATEADD(day, 1, @StartDate) SET @i = @i + 1 END SELECT 'Query:' + CAST(DATEDIFF(ms,@Time,GETDATE()) AS VARCHAR(50))

Risultato: 10000 chiamate a SP in ~560 ms, 10000 chiamate a sql statement in ~16300 ms. Quindi in questo semplice esempio le SP sono ~29 volte più veloci degli statement sql. Quindi, la scelta di cosa usare dipende ancora una volta dal particolare contesto.

«November»
SunMonTueWedThuFriSat
2930311234
567891011
12131415161718
19202122232425
262728293012
3456789