Po połączeniu z naszym serwerem produkcyjnym (SQL Server 2008, bardzo mocna maszyna), instrukcja SELECT zajmuje 2 sekundy , zwracając wszystkie pola (łącznie 4 MB danych).
SELECT TOP (30000) *
FROM person
WITH(NOLOCK);
Z dowolnego innego urządzenia w tej samej sieci (łączenie za pomocą uwierzytelniania SQL lub Windows) to samo zapytanie zajmuje 1 minutę i 8 sekund .
Testuję tę bardzo prostą instrukcję, aby zilustrować, że nie jest to problem z indeksowaniem ani problem związany z zapytaniami. (W tej chwili mamy problemy z wydajnością wszystkich zapytań ...)
Rzędy występują w kawałkach i nie wszystkie naraz. Natychmiast otrzymuję pierwsze rzędy, a następnie czekam ponad 1 minutę na pojawienie się partii rzędów.
Oto statystyki klienta zapytania, które jest uruchamiane ze zdalnego pola:
Query Profile Statistics
Number of INSERT, DELETE and UPDATE statements 0
Rows affected by INSERT, DELETE, or UPDATE statements 0
Number of SELECT statements 2
Rows returned by SELECT statements 30001
Number of transactions 0
Network Statistics
Number of server roundtrips 3
TDS packets sent from client 3
TDS packets received from server 1216
Bytes sent from client 266
Bytes received from server 4019800
Time Statistics
Client processing time 72441 ms (72 seconds)
Total execution time 72441 ms
Wait time on server replies 0
Widzimy, że „Czas przetwarzania klienta” jest równy całkowitemu czasowi wykonania.
Czy ktoś wie, jakie kroki mogę podjąć, aby zdiagnozować, dlaczego transfer rzeczywistych danych zajmuje dużo czasu?
Czy istnieje parametr konfiguracyjny SQL, który ogranicza lub ogranicza szybkość przesyłania danych między komputerami?
źródło
Odpowiedzi:
Twój problem jest zdecydowanie związany z siecią na podstawie twoich informacji. W związku z tym należy się tym zająć ze specjalistami ds. Sieci (nie jestem tym).
Rzeczy, które mogą pomóc:
Czy serwer WWW znajduje się w tej samej podsieci co serwer SQL?
Czy są między nimi routery / mosty itp.?
Niewiele możliwych zmian na serwerze SQL:
Używasz domyślnego rozmiaru: zobacz swoje statystyki: „Pakiety TDS otrzymane z serwera 1216” (4 MB / 1 K = 4KB). Tak, rozmiar bufora TDS można zmienić: patrz w Google: „Rozmiar partii protokołu TDS”
Dobra dyskusja na ten temat: „czy rozmiar pakietu sieciowego sql naprawdę determinuje ruch w obie strony?”
Jednak zmiana rozmiaru opakowania TDS będzie (nieuchronnie) mieć nieprzewidywalne skutki i powinna być stosowana w produkcji tylko w wyjątkowych przypadkach.
Pomogłaby również zmiana architektury lub wprowadzenie buforowania danych w warstwie pośredniej.
źródło
Ten problem został już rozwiązany.
To był problem z siecią, a pudełko SQL używało karty sieciowej 100 MB / s , zamiast karty sieciowej 10 GB / s ...
Zmiana konfiguracji sieci w celu użycia właściwej karty sieciowej rozwiązała problem. Teraz uzyskujemy podobną wydajność dla wszystkich zapytań z pola Production SQL i innych pól w sieci.
Dziękuję wszystkim za pomoc.
źródło
Przy pierwszym odczuciu wydaje się, że występują problemy z opóźnieniem sieci. Czy spojrzałeś na niektóre z liczników Network Perfmon? Mogą one dać ci pewne wskazówki na temat tego, co dzieje się z siecią.
Cytat z Jakie liczniki Perfmon powinienem monitorować i co każdy z nich oznacza?
źródło
Kilka wstępnych pytań: 1) Serwer ma klienta SQL na Prod. skonfigurowano maszynę serwerową, prawda? Więc jeśli wykonasz to samo zapytanie od klienta znajdującego się na tym samym komputerze, zostanie ono wykonane za 2 sekundy? Próbowałeś to zrobić? Czy to naprawdę 2 sekundy? 2) Wspomniałeś, że zmieniono konfigurację środowiska produkcyjnego (lub serwer produkcyjny został przeniesiony do innej sieci / całkowitej przebudowy serwera), prawda? Jaki był czas zużycia zapytania w starym środowisku produkcyjnym?
Z ciekawości: to jest przykład zapytania? lub dokładne sformułowanie zapytania? Zapytanie naprawdę NIE zawiera klauzuli WHERE? Zgadzam się ze mną, że jest to bardzo nietypowe .. Tabela ma indeks klastrowy czy jest stertą? Tabela zawiera w sumie ile wierszy? Stół jest mocno rozdrobniony? Z ciekawości: dlaczego warto wybrać TOP NNN? Dlaczego nie ustawić ROWCOUNT NNN - a następnie WYBIERZ *? To zapytanie jest wydawane ile razy klient dziennie? 1? 100? 1 MLN? Podstawowe dane są statyczne lub dynamiczne i ulegają znacznej zmianie? Ile (0,01 procent dziennie? 1 procent dziennie? 10 procent dziennie?) Dane wyjściowe zapytania są przetwarzane programowo? (nie przez użytkownika?) Dlaczego nie jest buforowany / nie jest przechowywany w warstwie pośredniej? dzięki, Aleksiej
źródło