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ć.

Arthur Yegiazaryan
źródło
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.

Dan Guzman
źródło
2

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

SET ROWCOUNT 0

... aby to wyłączyć.

Rob Farley
źródło
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