Dlaczego TOP działa w planie wykonania SQL


9

Po chwili poszukiwań postanowiłem opublikować to pytanie z powodu braku odpowiedzi i przepraszam, jeśli istnieje podobne pytanie / odpowiedź.

Podczas uruchamiania poniższego zapytania na dwóch podobnie skonfigurowanych serwerach SQL napotykamy różne plany wykonania, które wpływają na wydajność i potrzebujemy pomocy w ustaleniu przyczyny.

Zapytanie:

SELECT process_id
INTO #temp
FROM revrep_revenue_fact
WHERE process_id = 284 
DROP TABLE #temp

Plan wykonania serwera A Serwer B

Plan wykonania serwera B Serwer B http://s2.postimg.org/z9fjrfv4n/server_B.png

Zauważysz, że serwer B ma NAJWYŻSZĄ fizyczną operację w aktualnym planie wykonania, a my próbujemy dowiedzieć się, dlaczego. Oba zapytania używają tego samego indeksu w Indeksie wyszukiwania.

Oto kilka szczegółów dotyczących serwera A i serwera B.

Serwer A i B to oba

Windows Server 2008 R2 Standard Service Pack 1

24 GB pamięci RAM

64-bitowy system operacyjny

Wersje programu SQL Server 2012 uzyskane przy użyciu ( WYBIERZ SERWERPROPERTY („ProductVersion”) )

Serwer A Wersja SQL 11.0.3000.0

Serwer B Wersja SQL 11.0.5058.0

Co próbowaliśmy

  1. Procedury czyszczenia pamięci podręcznej
  2. Indeksy odbudowy
  3. Odświeżanie statystyk
  4. USTAW ROWCOUNT 0 z rowcount i idź

Dlaczego serwer B ma TOP w planie wykonania? W tym prostym przykładzie zapytania nie ma prawdziwych problemów, ale w większym zapytaniu koszty TOPU rosną i widzimy spadek wydajności. Każda pomoc w debugowaniu tego będzie bardzo mile widziana, a my możemy uzyskać wszelkie dodatkowe informacje, których możesz potrzebować.


TOPOperatora sugeruje niezerowe SET ROWCOUNTuprzednio wykonywany w tym względzie. Spróbuj ponownie po wykonaniu SET ROWCOUNT 0;. Ponadto opublikowane wersje SQL nie są SQL 2008 R2. Uruchom SELECT SERVERPROPERTY('ProductVersion');na 2 serwerach, aby uzyskać aktualną wersję programu SQL Server.
— Dan Guzman,

Zaktualizowałem oryginalny post za pomocą wersji SQL za pomocą podanego zapytania select. Serwery, na których jest zainstalowany SQL są serwerami Windows 2008 R2, a na SQL 2012 są zainstalowane. Jak wcześniej zasugerował inny członek, a następnie usunięto, próbowaliśmy ustawić ROWCOUNT na 0 bez zmiany planu wykonania. Zobacz zaktualizowane pytanie
— Arthur Yegiazaryan

Czy możesz wstawić GOpo wierszu liczby wierszy. Czy możesz również opublikować właściwości operatora Top?
— Rob Farley,

Rob, dodał GO i właściwości z TOP do oryginalnego postu
— Arthur Yegiazaryan

Odpowiedzi:


12

Sprawdź, czy poziom zgodności bazy danych jest taki sam na 2 serwerach. Uruchomiłem szybki test na wystąpieniu programu SQL Server 2012 i zobaczyłem, że wprowadzono operatora TOP, jeśli poziom zgodności wynosi 100 lub mniej. O ile nie masz konkretnego powodu, aby zrobić inaczej, najlepiej użyć poziomu zgodności 110 (SQL Server 2012) w wystąpieniu SQL Server 2012.


2

Myślę, że masz wartość ROWCOUNT. Zrobić:

SET ROWCOUNT 0

... aby to wyłączyć.


1
ZESTAW ROWCOUNT 0 nie usunął TOP z planu egzekucji
— Arthur Yegiazaryan

1
@Arthur Chociaż to nie było rozwiązanie w twoim przypadku, może być przyczyną zachowania przyszłych czytelników. (Przepraszam Rob, mogłem cofnąć usunięcie twojego postu, ponieważ to naprawdę może być problem z tym samym symptomem.)
— Aaron Bertrand

Aaron, zgodził się i dziękuję za przyniesienie go. Nie jest to rozwiązanie dla mnie, ale może być dla innych.
— Arthur Yegiazaryan
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.