ho utilizzando prossimi query per l'estrazione top 100 e 101 linee da DB e gettings seguenti tempi che intercorrono, che ha completamente diversa (seconda query ~ 8 più lento di prima):interrogazione Basse prestazioni durante l'utilizzo di variabili del database
SELECT TOP (100) *
FROM PhotoLike WHERE [email protected] AND accountId<>@accountId
ORDER BY createDate DESC
GO
SQL Tempi di esecuzione del server: Tempo CPU = 187 ms, tempo trascorso = 202 ms.
SELECT TOP (101) *
FROM PhotoLike WHERE [email protected] AND accountId<>@accountId
ORDER BY createDate DESC
GO
esecuzione SQL Server: il tempo CPU = 266 ms, tempo trascorso = 1644 ms.
Piano di esecuzione dei primi due casi:
Ma se mi libero di variabile @accoundId, vengo seguenti risultati, che equivale a circa e più veloce più di 2 volte rispetto a prima query da questa domanda.
SELECT TOP (100) *
FROM PhotoLike WHERE photoAccountId=10 AND accountId<>10
ORDER BY createDate DESC
GO
esecuzione SQL Server: il tempo CPU = 358 ms, tempo trascorso = 90 ms.
SELECT TOP (101) *
FROM PhotoLike WHERE photoAccountId=10 AND accountId<>10
ORDER BY createDate DESC
GO
esecuzione SQL Server: il tempo CPU = 452 ms, tempo trascorso = 93 ms.
Piano di esecuzione di seconde due casi:
Perché questo accada e come posso migliorare le prestazioni con varibales?
UPDATE
Aggiunto piani di esecuzione.
Hai visto il piano di esecuzione? – Brandon
'TOP 100/TOP 101' è un problema noto, vedere [questo blog] (http://www.mssqltips.com/sqlservertip/2053/trick-to-optimize-top-clause-in-sql-server/). La degradazione della velocità con i parametri è probabilmente dovuta a [parametro sniffing] (http://blogs.technet.com/b/mdegre/archive/2012/03/19/what-is-parameter-sniffing.aspx). –
@ NikolaMarkovinović - Questo è l'opposto dello sniffing dei parametri, le variabili non vengono sniffate, tranne se si utilizza 'OPTION (RECOMPILE)' in modo che faccia un'ipotesi generica non basata sui valori effettivi. Il comportamento 'TOP 101' [non è sempre un problema] (http://sqlblog.com/blogs/paul_white/archive/2010/08/27/sorting-row-goals-and-the-top-100-problem .aspx) anche se sembra che sia in questo caso. È il punto di separazione tra fare un ordinamento completo e un ordinamento 'TOP N'. –