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
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
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ć.
źródło
TOP
Operatora sugeruje niezeroweSET ROWCOUNT
uprzednio wykonywany w tym względzie. Spróbuj ponownie po wykonaniuSET ROWCOUNT 0;
. Ponadto opublikowane wersje SQL nie są SQL 2008 R2. UruchomSELECT SERVERPROPERTY('ProductVersion');
na 2 serwerach, aby uzyskać aktualną wersję programu SQL Server.GO
po wierszu liczby wierszy. Czy możesz również opublikować właściwości operatora Top?Odpowiedzi:
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.
źródło
Myślę, że masz wartość ROWCOUNT. Zrobić:
... aby to wyłączyć.
źródło