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.
posted @ venerdì 10 novembre 2006 14:49