2013-08-08 10 views
6

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: Select top 100 and 101 with variable

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: Select top 100 and 101 without variable

Perché questo accada e come posso migliorare le prestazioni con varibales?

UPDATE

Aggiunto piani di esecuzione.

+2

Hai visto il piano di esecuzione? – Brandon

+3

'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). –

+0

@ 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'. –

risposta

2

Ci sono un paio di cose che succedono qui.

Quando si utilizzano le variabili, SQL Server non annota i valori, a meno che non si aggiunga anche OPTION (RECOMPILE).

La stima del numero di righe corrispondenti a [email protected] è molto più piccola con l'ipotesi di quanto sia effettivamente il caso. (Nota la linea spessa che esce dall'indice cerca nel secondo piano e la decisione di usare un piano parallelo).

anche TOP 100/TOP 101 è la cut off point tra TOP N ordinamento utilizzando un algoritmo che solo bisogno di spazio per ordinare 100 righe e facendo una sorta completa .. Numero stima riga imprecisa probabilmente significa la memoria insufficiente allocata per l'intero ordinamento e si sta riversando a tempdb.

La semplice aggiunta di OPTION (RECOMPILE) alla query con le variabili probabilmente migliorerà le cose un po 'anche se sembra che anche il piano "veloce" stia facendo molte ricerche chiave che potrebbero essere evitate con indici diversi.

0

Mi chiedo se questo potrebbe essere il parametro di sniffing correlato. Quanto velocemente va la seguente domanda?

DECLARE @accountIdParam int; 
SELECT @accountIdParam = @accountId; 

SELECT TOP (101) * 
FROM PhotoLike WHERE [email protected] AND accountId<>@accountIdParam 
ORDER BY createDate DESC 
GO 
+0

Sfortunatamente non si tratta di prestazioni migliori. –

+0

@KvanTTT Bene, quello che ho dato è un work-around per lo sniffing dei parametri, quindi non sembra che questo sia il problema. – Sam

0

È possibile, è necessario creare un indice cluster in base al campo accountId della tabella.

Come si prova un diseguaglianza, dovrebbe essere più performante:.

CREATE UNIQUE Clustered Index [IX_MyIndexName] ON [dbo] [PhotoLike] ( accountid DESC, CreateDate DESC, photoAccountId DESC, )

Problemi correlati