Mamy bazę danych dla produktu, który wymaga dużego zapisu. Właśnie kupiliśmy nowy serwer z dyskiem SSD, aby pomóc. Ku naszemu zdziwieniu wstawki nie były szybsze niż na naszej starej maszynie z dużo wolniejszym przechowywaniem. Podczas testów porównawczych zauważyliśmy, że wskaźnik operacji we / wy wykazywany przez proces SQL Server był bardzo niski.
Na przykład uruchomiłem skrypt znaleziony na tej stronie , z tą różnicą, że dodałem BEGIN TRAN i COMMIT wokół pętli. W najlepszym wypadku mogłem zobaczyć, że użycie dysku osiąga 7 Mb / s, a procesor ledwo dotknął 5%. Serwer ma zainstalowaną 64 Gb i używa 10. Całkowity czas działania wyniósł 2 minuty 15 sekund dla pierwszego połączenia i około 1 minuty dla kolejnych połączeń. Baza danych jest na prostym odzyskiwaniu i była bezczynna podczas testu. Upuściłem stolik między każdą rozmową.
Dlaczego tak prosty skrypt jest tak wolny? Sprzęt w ogóle nie jest używany. Zarówno narzędzia do analizy porównawczej dysków, jak i SQLIO wskazują, że dysk SSD działa poprawnie z prędkościami do 500 Mb / s zarówno w przypadku odczytu, jak i zapisu. Rozumiem, że zapisy losowe są wolniejsze niż zapisy sekwencyjne, ale oczekiwałbym, że taka prosta wstawka do tabeli bez indeksowania klastrowego będzie znacznie szybsza.
Ostatecznie nasz scenariusz jest znacznie bardziej złożony, ale uważam, że najpierw muszę zrozumieć prosty przypadek. W skrócie nasza aplikacja usuwa stare dane, a następnie używa SqlBulkCopy do kopiowania nowych danych do tabel pomostowych, wykonuje pewne filtrowanie, a na koniec używa MERGE i / lub INSERT INTO w zależności od przypadków, aby skopiować dane do ostatecznych tabel.
-> EDYCJA 1: Postępowałem zgodnie z procedurą powiązaną przez Martina Smitha i otrzymałem następujący wynik:
[Wait Type] [Wait Count] [Total Wait (ms)] [T. Resource Wait (ms)] [T. Signal Wait (ms)]
NETWORK_IO 5008 46735 46587 148
LOGBUFFER 901 5994 5977 17
PAGELATCH_UP 40 866 865 1
SOS_SCHEDULER_YIELD 53279 219 121 98
WRITELOG 5 145 145 0
PAGEIOLATCH_UP 4 58 58 0
LATCH_SH 5 0 0 0
Uważam, że to dziwne NETWORK_IO zajmuje większość czasu, biorąc pod uwagę, że nie ma żadnych wyników do wyświetlenia i żadnych danych do przesłania gdziekolwiek poza plikami SQL. Czy typ NETWORK_IO obejmuje wszystkie operacje wejścia / wyjścia?
-> EDYCJA 2: Utworzyłem dysk RAM 20 Gb i stamtąd zamontowałem bazę danych. Najlepszy czas, jaki miałem na dysku SSD to 48s, z dyskiem RAM spadł do 37 sekund. NETWORK_IO jest nadal największym oczekiwaniem. Maksymalna prędkość zapisu na dysku RAM wynosiła około 250 Mb / s, podczas gdy jest on w stanie wykonać wiele gigabajtów na sekundę. Nadal nie zużywał dużo procesora, więc co powstrzymuje SQL?
NETWORK_IO
może być od 3 mln „1 row (s) affected” wiadomości są odsyłane. Czy próbowałeś dodać SET NOCOUNT ON
do skryptu?
EE_WaitStats*.xel
więc stare zepsują twoje wyniki.
SET NOCOUNT ON
do tego dodał .