2013-08-08 13 views
6

I przy użyciu kolejnych zapytań ekstrakcji górne 100 i 101 linii z dB gettings następujące upływający czas, który całkowicie różni się (drugie zapytanie ~ 8 wolniej niż pierwszy)niskiej zapytanie wydajności podczas używania zmiennych bazy

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

SQL Czasy wykonania serwera: Czas procesora = 187 ms, czas, który upłynął = 202 ms.

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

SQL Server Execution Times: czas CPU = 266 ms, czas, jaki upłynął = 1644 ms.

Plan Wykonanie pierwszych dwóch przypadkach: Select top 100 and 101 with variable

Ale gdybym pozbyć zmiennej @accoundId, mam następujące wyniki, co w przybliżeniu równa się szybciej i więcej niż 2 razy niż pierwszego zapytania z tym pytaniem.

SELECT TOP (100) * 
FROM PhotoLike WHERE photoAccountId=10 AND accountId<>10 
ORDER BY createDate DESC 
GO 

SQL Server Execution Times: czas CPU = 358 ms, czas, jaki upłynął = 90 ms.

SELECT TOP (101) * 
FROM PhotoLike WHERE photoAccountId=10 AND accountId<>10 
ORDER BY createDate DESC 
GO 

SQL Server Execution Times: czas CPU = 452 ms, czas, jaki upłynął = 93 ms.

Plan Wykonanie drugich dwóch przypadkach: Select top 100 and 101 without variable

Dlaczego tak się stało i jak mogę poprawić wydajność z varibales?

UPDATE

Dodane plany wykonania.

+2

Czy obejrzałeś plan wykonania? – Brandon

+3

'TOP 100/TOP 101' jest znanym problemem, patrz [ten blog] (http://www.mssqltips.com/sqlservertip/2053/trick-to-optimize-top-clause-in-sql-server/). Redukcja prędkości z parametrami jest prawdopodobnie spowodowana [parametrem sniffing] (http://blogs.technet.com/b/mdegre/archive/2012/03/19/what-is-parameter-sniffing.aspx). –

+0

@ NikolaMarkovinović - Jest to przeciwieństwo sniffowania parametrów, zmienne nie są sniffowane, chyba że używa się opcji "OPTION (RECOMPILE)", więc po prostu generuje ogólne przypuszczenie nie oparte na rzeczywistych wartościach. Zachowanie "TOP 101" [nie zawsze jest problemem] (http://sqlblog.com/blogs/paul_white/archive/2010/08/27/sorting-row-goals-and-the-top-100-problem .aspx), chociaż wygląda tak, jak w tym przypadku. Jest to punkt odcięcia między pełnym sortowaniem a sortowaniem "TOP N". –

Odpowiedz

2

Jest tu kilka rzeczy.

Gdy używasz zmiennych SQL Server nie wykrywa w ogóle wartości, chyba że dodasz także OPTION (RECOMPILE).

Wartość szacunkowa liczby rzędów pasujących do [email protected] jest znacznie mniejsza w porównaniu z przypuszczeniami, niż ma to miejsce w rzeczywistości. (Zauważ, że gruby wiersz wychodzący z indeksu poszukuje w drugim planie, a decyzja o zastosowaniu planu równoległego).

także TOP 100/TOP 101 jest cut off point między TOP N sortowania za pomocą algorytmu, który po prostu potrzebuje miejsca do sortowania 100 wierszy i to robi pełną rodzaju .. The niedokładne oszacowanie liczba wierszy prawdopodobnie oznacza, że ​​jest za mało pamięci przydzielone do pełnego sortowania i rozlewa się na tempdb.

Po prostu dodanie OPTION (RECOMPILE) do zapytania ze zmiennymi prawdopodobnie trochę poprawi sytuację, choć wygląda na to, że nawet "szybki" plan przeprowadza wiele kluczowych wyszukiwań, których można uniknąć za pomocą różnych indeksów.

0

Zastanawiam się, czy może to być związane z sniffingiem parametrów. Jak szybko działa następująca kwerenda?

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

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

Niestety nie jest to poprawiona wydajność. –

+0

@KvanTTT No cóż, to, co dałem, było obejściem dla sniffingu parametrów, więc nie wydaje się, żeby to był problem. – Sam

0

Mogę, powinieneś utworzyć indeks klastrowy w oparciu o pole accountId twojej tabeli.

Jak przetestować nierówności, powinno być bardziej wydajnych.

tworzyć unikalne klastrowych INDEX [IX_MyIndexName] ON [dbo] [PhotoLike] ( accountid DESC, CreateDate DESC, photoAccountId DESC, )

Powiązane problemy