Migawka bazy danych zapewnia widok tylko do odczytu bazy danych programu SQL Server, który jest transakcyjnie spójny ze stanem źródłowej bazy danych w momencie tworzenia migawki bazy danych. Istnieje wiele powodów, dla których warto korzystać z migawek bazy danych, na przykład raportowanie do lustrzanej bazy danych, a DBCC CHECKDB używa również wewnętrznych migawek bazy danych od SQL Server 2005.
Migawki bazy danych zapewniają również możliwość cofnięcia wszystkich zmian, które nastąpiły w bazie danych od czasu utworzenia migawki bazy danych, ale z nieprzyjemnym efektem ubocznym w dzienniku transakcji bazy danych, o którym pisał Paul tutaj.
Jedną z rzeczy, które nie są powszechnie brane pod uwagę ani pokazywane w migawkach bazy danych, jest wpływ na wydajność, jaki migawka ma dla obciążenia związanego z zapisem bazy danych. Zespół SQLCAT opublikował oficjalny dokument dotyczący SQL Server 2005, Zagadnienia dotyczące wydajności migawek bazy danych w przypadku obciążeń o dużym natężeniu operacji we/wy, w którym zbadano wpływ migawek bazy danych na wydajność, a po niedawnej pracy z klientem, u którego migawki bazy danych powodowały problemy z wydajnością, chciałem przetestuj SQL Server 2012 i określ, czy wystąpiły jakiekolwiek zmiany w narzutach dotyczących migawek bazy danych po siedmiu latach i trzech wydaniach SQL Server później.
Konfiguracja testowa
Aby przetestować wpływ migawek bazy danych na wydajność obciążenia związanego z zapisem, użyłem naszego Dell R720 wykonującego wstawienie 1 000 000 wierszy do nowej tabeli w powiększonej wersji bazy danych AdventureWorks2012. Baza danych AdventureWorks2012 została utworzona z 8 plikami danych rozmieszczonymi na dwóch dyskach SSD Fusion-io ioDrive Duo 640 GB, z których każdy został skonfigurowany jako dwa oddzielne dyski 320 GB w systemie Windows, co daje łącznie 4 dyski. Aby uprościć wyjaśnienie konfiguracji, układ pamięci używany w tych testach pokazano w poniższej tabeli:
Dysk | Konfiguracja | Użycie |
---|---|---|
K | 15 tys. dysków RAID 5–6 | Migawka |
L | Fusion-io Card2 — strona B | Plik dziennika |
M | Fusion-io Card2 — strona A | 4 pliki danych |
N | Fusion-io Card1 — strona A | 4 pliki danych |
Q | Fusion-io Card1 — strona B | Tempdb |
R | LSI Nytro BLP4-1600 | Migawka |
Tabela 1 – Układ i użycie dysku serwera
Pamięć masową dla migawki bazy danych stanowiła macierz RAID-5 składająca się z sześciu dysków SAS 15 tys. obr./min podłączonych przez iSCSI lub karta LSI Nytro BLP4-1600 PCI-E.
W obciążeniu testowym użyto następującej instrukcji SELECT INTO do wygenerowania tabeli 1 000 000 wierszy, która została pominięta między każdym z testów.
SELECT TOP 1000000 * INTO tmp_SalesOrderHeader FROM Sales.SalesOrderHeaderEnlarged;
Testy zostały tak zaplanowane, aby zmierzyć czas trwania bez migawki bazy danych, a następnie czas trwania z migawką bazy danych utworzoną na każdym urządzeniu pamięci masowej w celu zmierzenia spadku wydajności spowodowanego zapisywaniem zmian stron w rzadkim pliku migawki bazy danych. Testy przeprowadzono również przy użyciu dwóch migawek bazy danych na tym samym urządzeniu pamięci masowej, aby ustalić, jaki może być koszt posiadania dodatkowych migawek bazy danych w przypadku zduplikowanych operacji zapisu, które potencjalnie muszą być wykonane.
Wyniki
Każda konfiguracja testowa została wykonana dziesięć razy, a średni czas trwania, przeliczony z milisekund na sekundy w celu łatwiejszego przeglądania, pokazano na rysunku 1, dla 0, 1 lub 2 migawek bazy danych.
Rysunek 1 – Czas trwania migawki
Testy bazowe bez migawek bazy danych wykonywanych średnio w ciągu 1,8 sekundy, a nawet jeśli pamięć masowa dla plików migawek bazy danych była równoważna pod względem wydajności, istnienie pojedynczej migawki bazy danych nakładało się na wydajność zapisu w bazie danych. Obciążenie drugiej migawki bazy danych jest niższe niż w przypadku pierwszej migawki bazy danych w każdym z testów, chociaż dyski o prędkości 15 tys. P>
Wydajność na karcie LSI Nytro początkowo mnie zaskoczyła, ponieważ była to również karta SSD PCI-X. Jednak po omówieniu wyników z Glennem wspomniał, że kompresja kontrolera Sandforce i wolniejsza wydajność zapisu dla losowych danych o niskiej kompresji z jego poprzednich testów na dysku. Jednak nadal łatwo zdeklasował wirujące media.
Przed uruchomieniem testów chciałem wiedzieć, jakie typy oczekiwania wystąpią podczas testów, więc w ramach konfiguracji testu wyczyściłem sys.dm_os_wait_stats za pomocą DBCC SQLPERF i przechwyciłem dane wyjściowe z DMV dla każdego uruchomienia testu w tabeli. Najwyższymi oczekiwaniami na konfiguracje pojedynczych zrzutów były PREEMPTIVE_OS_WRITEFILE i WRITE_COMPLETION, jak pokazano na rysunku 2, dla 1 lub 2 zrzutów bazy danych.
Ilustracja 2 – Migawka u góry czeka
Jednym z interesujących elementów było dodanie funkcji oczekiwania FCB_REPLICA_WRITE na utworzenie drugiego zrzutu. Po przejrzeniu wyników oczekiwania na migawkę pojedynczej bazy danych i ponownym uruchomieniu kilku rund testów to oczekiwanie nigdy nie występuje w przypadku pojedynczej migawki i występuje tylko wtedy, gdy istnieje więcej niż jedna migawka i jest skojarzone z kopiowaniem stron do plików migawek bazy danych. Czasy oczekiwania na trend oczekiwania PREEMPTIVE_OS_WRITEFILE są ściśle powiązane ze wzrostem czasu wykonywania dla każdej konfiguracji.
Mając na uwadze te wyniki, podczas przeglądania systemu przy użyciu metodologii Waits and Queues, zobaczenie tego typu oczekiwania z wyższymi wartościami może być warte zbadania, czy dla którejkolwiek z baz danych na serwerze istnieją migawki bazy danych.
Wniosek
Podczas korzystania z migawek bazy danych, nawet w programie SQL Server 2012, występuje obciążenie związane z dodatkowymi zapisami wymaganymi do kopiowania stron danych do plików rozrzedzonych migawek. Jeśli korzystanie z migawek bazy danych jest częścią ogólnej konfiguracji, byłbym naprawdę ostrożny przy planowaniu podsystemu we/wy, aby spełniał wymagania obciążenia dla współbieżnej aktywności we/wy z rzadkimi plikami migawek bazy danych.
Na podstawie wyników tych testów rozważyłbym nawet umieszczenie migawek bazy danych na dyskach SSD przed tempdb ze względu na wydajność zapisu, a także mniejszy wpływ na wydajność związany z konserwacją migawek.
Jak zawsze, Twój przebieg może się różnić i na pewno będziesz chciał przetestować wydajność dowolnej konfiguracji przed wprowadzeniem jej do użytku produkcyjnego.