Database
 sql >> Baza danych >  >> RDS >> Database

Rozszerzenie zastosowań DBCC CLONEDATABASE

Service Pack 2 dla SQL Server 2014 został wydany w zeszłym miesiącu (przeczytaj uwagi do wydania tutaj) i zawiera nową instrukcję DBCC:DBCC CLONEDATABASE . Byłem bardzo podekscytowany wprowadzeniem tego polecenia, ponieważ zapewnia ono bardzo łatwe sposób kopiowania schematu bazy danych, w tym statystyk , który może być używany do testowania wydajności zapytań bez konieczności zajmowania miejsca na dane w bazie danych. W końcu znalazłem trochę czasu na przetestowanie DBCC CLONEDATABASE i rozumiem ograniczenia, i muszę powiedzieć, że było to raczej zabawne.

Podstawy

Zacząłem od utworzenia klonu bazy danych AdventureWorks2014 i uruchomienia zapytania względem źródłowej bazy danych, a następnie bazy danych klonu:

DBCC CLONEDATABASE (N'AdventureWorks2014', N'AdventureWorks2014_CLONE');
GO
 
SET STATISTICS IO ON;
GO
SET STATISTICS TIME ON;
GO
SET STATISTICS XML ON;
GO
 
USE [AdventureWorks2014];
GO
 
SELECT *
FROM [Sales].[SalesOrderHeader] [h]
JOIN [Sales].[SalesOrderDetail] [d] ON [h].[SalesOrderID] = [d].[SalesOrderID]
ORDER BY [SalesOrderDetailID];
GO
 
USE [AdventureWorks2014_CLONE];
GO
 
SELECT *
FROM [Sales].[SalesOrderHeader] [h]
JOIN [Sales].[SalesOrderDetail] [d] ON [h].[SalesOrderID] = [d].[SalesOrderID]
ORDER BY [SalesOrderDetailID];
GO
 
SET STATISTICS IO OFF;
GO
SET STATISTICS TIME OFF;
GO
SET STATISTICS XML OFF;
GO

Jeśli spojrzę na dane wyjściowe I/O i TIME, widzę, że zapytanie do źródłowej bazy danych trwało dłużej i generowało znacznie więcej I/O, z których oba są oczekiwane, ponieważ baza danych klonu nie zawiera żadnych danych:

/* baza danych SOURCE */

Czasy wykonywania programu SQL Server:
Czas procesora =0 ms,  czas, który upłynął =0 ms.

Czas analizy i kompilacji SQL Server:
Czas procesora =0 ms, czas, który upłynął =4 ms.

(121317 wierszy, których dotyczy problem)

Tabela „Nagłówek zamówienia sprzedaży”. Liczba skanów 0, odczyty logiczne 371567, odczyty fizyczne 0, odczyty z wyprzedzeniem 0, odczyty logiczne modułu 0, odczyty fizyczne modułu 0, odczyty modułu z wyprzedzeniem 0.

Stół „Stół roboczy”. Liczba skanów 0, odczyty logiczne 0, odczyty fizyczne 0, odczyty z wyprzedzeniem 0, odczyty logiczne lobu 0, odczyty fizyczne lobu 0, odczyty z wyprzedzeniem lobu 0.

Tabela „Szczegóły zamówienia sprzedaży”. Liczba skanów 5, odczyty logiczne 1361, odczyty fizyczne 0, odczyty z wyprzedzeniem 0, odczyty logiczne modułu 0, odczyty fizyczne modułu 0, odczyty modułu z wyprzedzeniem 0.

Stół „Stół roboczy”. Liczba skanów 0, odczyty logiczne 0, odczyty fizyczne 0, odczyty z wyprzedzeniem 0, odczyty logiczne lobu 0, odczyty fizyczne lobu 0, odczyty z wyprzedzeniem lobu 0.

(1 wiersz(e) dotyczy)

Czasy wykonywania programu SQL Server:
Czas procesora =686 ms,  czas, który upłynął =2548 ms.

/* Baza danych KLONOWANIA */

Czasy wykonywania programu SQL Server:
Czas procesora =0 ms,  czas, który upłynął =0 ms.

Czas parsowania i kompilacji SQL Server:
Czas procesora =12 ms, czas, który upłynął =12 ms.

(0 wierszy dotkniętych)

Stół „Stół roboczy”. Liczba skanów 0, odczyty logiczne 0, odczyty fizyczne 0, odczyty z wyprzedzeniem 0, odczyty logiczne lobu 0, odczyty fizyczne lobu 0, odczyty z wyprzedzeniem lobu 0.

Tabela „Nagłówek zamówienia sprzedaży”. Liczba skanów 0, odczyty logiczne 0, odczyty fizyczne 0, odczyty z wyprzedzeniem 0, odczyty logiczne lobu 0, odczyty fizyczne lobu 0, odczyty z wyprzedzeniem lobu 0.

Tabela „Szczegóły zamówienia sprzedaży”. Liczba skanów 5, odczyty logiczne 0, odczyty fizyczne 0, odczyty z wyprzedzeniem 0, odczyty logiczne modułu 0, odczyty fizyczne modułu 0, odczyty modułu z wyprzedzeniem 0.

(1 wiersz(e) dotyczy)

Czasy wykonywania programu SQL Server:
Czas procesora =0 ms,  czas, który upłynął =83 ms.

Jeśli spojrzę na plany wykonania, są one takie same dla obu baz danych, z wyjątkiem rzeczywistych wartości (ilości danych, które faktycznie przeszły przez plan):

Plan zapytań do bazy danych AdventureWorks2014

Plan zapytań do bazy danych AdventureWorks2014_CLONE

W tym miejscu wartość DBCC CLONEDATABASE jest oczywiste – mogę otrzymać pustą kopię bazy danych każdemu (pomoc techniczna firmy Microsoft, mój kolega administrator danych itp.) i poprosić ich o odtworzenie i zbadanie problemu, i nie potrzebują do tego potencjalnie setek GB miejsca na dysku to. Lipcowy wpis Melissy o T-SQL we wtorek zawiera szczegółowe informacje o tym, co dzieje się podczas procesu klonowania, więc polecam go przeczytać, aby uzyskać więcej informacji.

Czy o to chodzi?

Ale… czy mogę zrobić więcej z DBCC CLONEDATABASE? ? To znaczy, to jest świetne, ale myślę, że jest wiele innych rzeczy, które mogę zrobić z pustą kopią bazy danych. Jeśli przeczytałeś dokumentację dla DBCC CLONEDATABASE , zobaczysz tę linię:

Pomoc techniczna firmy Microsoft może poprosić o wygenerowanie klonu bazy danych przy użyciu DBCC CLONEDATABASE w celu zbadania problemu z wydajnością związanego z optymalizatorem zapytań.

Moja pierwsza myśl brzmiała:„Optymalizator zapytań – hmm… czy mogę użyć tego jako opcji do testowania uaktualnień ?”

Cóż, sklonowana baza danych jest tylko do odczytu, ale pomyślałem, że i tak spróbuję zmienić niektóre opcje. Na przykład, gdybym mógł zmienić tryb zgodności, byłoby to naprawdę fajne, ponieważ wtedy mógłbym przetestować zmiany CE zarówno w SQL Server 2014, jak i SQL Server 2016.

USE [master];
GO
 
ALTER DATABASE [AdventureWorks2014_CLONE] SET COMPATIBILITY_LEVEL = 110;

Pojawia się błąd:

Msg 3906, Poziom 16, Stan 1
Nie udało się zaktualizować bazy danych „AdventureWorks2014_CLONE”, ponieważ baza danych jest tylko do odczytu.
Msg 5069, Poziom 16, Stan 1
Instrukcja ALTER DATABASE nie powiodła się.

Hm. Czy mogę zmienić model odzyskiwania?

ALTER DATABASE [AdventureWorks2014_CLONE] SET RECOVERY SIMPLE WITH NO_WAIT;

Mogę. To nie wydaje się sprawiedliwe. Cóż, jest tylko do odczytu, czy mogę to zmienić?

ALTER DATABASE [AdventureWorks2014_CLONE] SET READ_WRITE WITH NO_WAIT;

TAK! Zanim się zbytnio podekscytujesz, pozwól, że zostawię tę notatkę z dokumentacji tutaj:

Uwaga Nowo wygenerowana baza danych wygenerowana z DBCC CLONEDATABASE nie jest obsługiwana do użycia jako produkcyjna baza danych i jest przeznaczona głównie do rozwiązywania problemów i celów diagnostycznych. Zalecamy odłączenie sklonowanej bazy danych po utworzeniu bazy danych.

Powtórzę ten wiersz z dokumentacji, pogrubię go i zaznaczę na czerwono jako przyjazny, ale niezwykle ważny przypomnienie:

Nowo wygenerowana baza danych wygenerowana z DBCC CLONEDATABASE nie jest obsługiwana do użycia jako produkcyjna baza danych i jest przeznaczona głównie do rozwiązywania problemów i celów diagnostycznych.

Cóż, to w porządku, zdecydowanie nie zamierzałem używać tego do produkcji, ale teraz mogę go użyć do testów! TERAZ mogę zmienić tryb zgodności, a TERAZ mogę wykonać kopię zapasową i przywrócić ją na innej instancji w celu przetestowania!

USE [master];
GO
 
BACKUP DATABASE [AdventureWorks2014_CLONE]
  TO  DISK = N'C:\Backups\AdventureWorks2014_CLONE.bak'
  WITH INIT, NOFORMAT, STATS = 10, NAME = N'AW2014_CLONE_full';
GO
 
/* restore on SQL Server 2016 */
 
 
RESTORE DATABASE [AdventureWorks2014_CLONE]
FROM  DISK = N'C:\Backups\AdventureWorks2014_CLONE.bak' WITH
MOVE N'AdventureWorks2014_Data' TO N'C:\Databases\AdventureWorks2014_Data_2684624044.mdf',
MOVE N'AdventureWorks2014_Log' TO N'C:\Databases\AdventureWorks2014_Log_3195542593.ldf',
NOUNLOAD,  REPLACE,  STATS = 5;
GO
 
ALTER DATABASE [AdventureWorks2014_CLONE] SET COMPATIBILITY_LEVEL = 130;
GO

TO JEST DUŻE.

W moim ostatnim poście mówiłem o flagi śledzenia 2389 i testowaniu za pomocą nowego modułu szacowania kardynalizacji, ponieważ, przyjaciele, potrzebujesz do testowania z nowym CE przed aktualizacją. Jeśli nie przeprowadzisz testów i zmienisz tryb zgodności na 120 (SQL Server 2014) lub 130 (SQL Server 2016) w ramach uaktualnienia, ryzykujesz pracę w trybie przeciwpożarowym, jeśli natkniesz się na regresje z nowym CE. Teraz możesz być w porządku, a wydajność może być jeszcze lepsza po uaktualnieniu. Ale… czy nie chciałbyś mieć pewności?

Bardzo często, gdy wspominam o testowaniu przed aktualizacją, słyszę, że nie ma środowiska, w którym można przeprowadzać testy. Wiem, że niektórzy z was mają środowisko testowe. Niektórzy z was mają Test, Dev, QA, UAT i kto wie co jeszcze. Masz szczęście.

Dla tych z was, którzy twierdzą, że w ogóle nie ma środowiska testowego, w którym można by testować, podaję DBCC CLONEDATABASE . Dzięki temu poleceniu nie masz wymówki, aby nie uruchamiać najczęściej wykonywanych zapytań i silnych trafień przeciwko klonowi Twojej bazy danych. Nawet jeśli nie masz środowiska testowego, masz własną maszynę. Utwórz kopię zapasową bazy danych klonów z produkcji, upuść klon, przywróć kopię zapasową do lokalnej instancji, a następnie przetestuj. Baza danych klonów zajmuje bardzo mało miejsca na dysku i nie narażasz się na rywalizację o pamięć ani we/wy, ponieważ nie ma danych. będziesz mieć możliwość sprawdzania poprawności planów zapytań z klonu względem planów z produkcyjnej bazy danych. Co więcej, jeśli przywracasz dane na SQL Server 2016, możesz włączyć Query Store do swoich testów! Włącz magazyn zapytań, przeprowadź testowanie w oryginalnym trybie zgodności, a następnie uaktualnij tryb zgodności i przetestuj ponownie. Możesz użyć Query Store do porównywania zapytań obok siebie! (Czy możesz powiedzieć, że teraz tańczę na krześle?)

Rozważania

Ponownie, nie powinno to być coś, czego można by użyć w środowisku produkcyjnym i wiem, że tego nie zrobiłbyś, ale trzeba to powtórzyć, ponieważ w obecnym stanie DBCC CLONEDATABASE nie jest w pełni kompletny . Zostało to odnotowane w artykule KB w obszarze obsługiwanych obiektów; obiekty, takie jak tabele zoptymalizowane pod kątem pamięci i tabele plików, nie są kopiowane, pełny tekst nie jest obsługiwany itp.

Teraz baza danych klonów nie jest pozbawiona wad. Jeśli przypadkowo uruchomisz odbudowę indeksu lub aktualizację statystyk w tej bazie danych, właśnie wyczyściłeś dane testowe. Stracisz oryginalne statystyki, których prawdopodobnie chciałeś w pierwszej kolejności. Na przykład, jeśli teraz sprawdzę statystyki dla indeksu klastrowego w SalesOrderHeader, otrzymam to:

USE [AdventureWorks2014_CLONE];
GO
DBCC SHOW_STATISTICS (N'Sales.SalesOrderHeader',PK_SalesOrderHeader_SalesOrderID);

Oryginalne statystyki dla SalesOrderHeader

Teraz, jeśli zaktualizuję statystyki względem tej tabeli, otrzymuję:

UPDATE STATISTICS [Sales].[SalesOrderHeader] WITH FULLSCAN;
GO
 
DBCC SHOW_STATISTICS (N'Sales.SalesOrderHeader',PK_SalesOrderHeader_SalesOrderID);

Zaktualizowane (puste) statystyki dla SalesOrderHeader

Jako dodatkowe zabezpieczenie, prawdopodobnie dobrym pomysłem jest wyłączenie automatycznych aktualizacji statystyk:

USE [master];
GO
ALTER DATABASE [AdventureWorks2014_CLONE] SET AUTO_UPDATE_STATISTICS OFF WITH NO_WAIT;

Jeśli zdarzy ci się przypadkowo zaktualizować statystyki, uruchom DBCC CLONEDATABASE a przejście przez proces tworzenia kopii zapasowej i przywracania nie jest takie trudne, a zautomatyzujesz go w mgnieniu oka.

Możesz dodać dane do bazy danych. Może to być przydatne, jeśli chcesz poeksperymentować ze statystykami (np. różne częstotliwości próbkowania, filtrowane statystyki) i masz wystarczająco dużo miejsca na przechowywanie kopii danych z tabeli.

Bez danych w bazie danych oczywiście nie uzyskasz rzetelnie reprezentatywnego czasu trwania i danych we/wy. W porządku. Jeśli potrzebujesz danych o rzeczywistym wykorzystaniu zasobów, potrzebujesz kopii swojej bazy danych ze wszystkimi zawartymi w niej danymi. DBCC CLONEDATABASE tak naprawdę dotyczy testowania wydajności zapytań; Otóż ​​to. W żaden sposób nie zastępuje tradycyjnego testowania aktualizacji — jest to jednak nowa opcja sprawdzania, w jaki sposób SQL Server optymalizuje zapytanie z różnymi wersjami i trybami zgodności. Miłego testowania!


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. SQL WYBIERZ W

  2. Metody tworzenia kopii zapasowych AWS RDS

  3. Śledzenie wysokiego CLR_MANUAL_EVENT czeka

  4. Dlaczego potrzebujesz modelowania danych?

  5. Schemat gwiazdy