Research SQL Server 2016CTP2 – 2/13

Po obejrzeniu wszystkiego po trochu, zachwyceniu się Live Query Statistics, na pierwszy ogień wziąłem Temporal Tables. Oczywiście, tym bardziej producent zaciekawił mnie do badania, czym to jest i jak działa, jak przeczytałem opis w Books online:

“The system automagically ensures that when the data changes in the table with the current data the previous values are stored in the historical table.”

Kogo by nie za nurtowało, że system robi coś automagicznie! J

Temporal database zostały szczegółowo przedstawione w standardzie SQL:2011 lub ISO/IEC 9075:2011, dla zainteresowanych standardem więcej informacji między innymi w dokumentach “What”s new in SQL:2011″ ACM SIGMOD (2012) oraz “Temporal Features in SQL:2011″ACM SIGMOD (2012)

 

Tworzenie Temporal Table

Pierwszą rzeczą, która jest konieczna, aby móc włączyć wersjonowanie danych w tabeli jest konieczność utworzenia kolumn do przechowywania znaczników czasowych, a także określenie okresu (PERIOD). Podobnie jak to określa standard.

Jak widzimy w powyższym przykładzie, zostały założone dwie kolumny jedna będąca początkiem okresu, druga końcem okresu. Obowiązkowo muszą być one zadeklarowane, jako typ DATETIME2. Pojawiły się dodatkowa składnia w poleceniu CREATE TABLE, GENERATED ALWAYS AS ROW START|END, oraz PERIOD FOR SYSTEM_TIME (kolumna1, kolumna2) służąca do określenia okresu obowiązywania wiersza.

Chcąc wyłączyć wersjonowanie tabeli, można poprzez ALTER TALBLE wykonać
SET SYSTEM_VERSIONING = OFF.

Po utworzeniu w ten sposób tabeli widać już ją w inny sposób w samym drzewie Object Explorera w SQL Server Management Studio

Jeszcze ciekawiej jak zajrzymy głębiej.

Okazuje się, że tabela historyczna zdefiniowana przy tworzeniu tej tabeli, znajduje się w jej wnętrzu, a przy symbolu tabeli występuje znaczek zegara. Jak widać, tabela ta ma takie same kolumny.

Jeśli chodzi o ograniczenia i wymagani to jest ich oczywiście trochę, między innymi wspomniany już wcześniej typ danych, to, że tabela, którą chcemy wersjonować musi mieć zdefiniowany PRIMARY KEY, oczywiście tabela z danymi historycznymi takiego klucza nie może posiadać, możemy robić tylko TRIGGER AFTER, oczywiście na tabeli wersjonowanej, ponadto nie zadziała polecenie TRUNCATE TABLE jak mamy włączone wersjonowanie. W wersji CTP2 nie można mieć wyliczalnych kolumn w tabeli.

Temporal table może być również użyte w połączeniu z rozwiązaniami:

  • AlwaysOn (gdzie jest pełne wsparcie)
  • Change Data Capture
  • Change Data Tracking
  • Tylko z jednym rodzajem replikacji – Transactional Replication

Zapytania na tabeli z wersjonowaniem

Mamy kilka dostępnych klauzuli, pozwalających na różne sposoby otrzymywać dane z tabel tymczasowych.

Najpierw może odpytajmy zwyczajnie dwie tabele.

Jak widać w historii mamy 3 razy wiersz pierwszy, który był właśnie tyle razy zmodyfikowany.

Pierwsza dostępna klauzula.

Zwraca ona rekordy były na ten moment czasowy

Oczywiście drobna zmiana, spowoduje, że pojawią się następne wiersze, oraz następna wersja wiersza o ID = 1.

Kolejną opcją pobierania danych historycznych, gdzie chcemy podać zakres obowiązywania to dwa podobne polecenia

Wynik tych obu zapytań jest identyczny

Ostatnia klauzula pokazuje jedynie te rekordy, które powstały i przestały obowiązywać w określonym przedziale czasowym.

Wynik takiego zapytania dla tych danych, co poprzednie dwa zapytania, nie zwróci żadnych danych. Jeżeli zmienimy np. tak:

To znajdzie nam jeden rekord, który powstał w tym okresie i w tym okresie przestał istnieć.

Jak widać elastyczność wykonywanych zapytań w zależności od czasu jest bardzo elastyczna. Przyjdzie na pewno czas by dokładnie to rozwiązanie zbadać pod kątem wydajności, czy też inaczej mówiąc narzutów związanych z takim rozwiązaniem, ale to już na pewno temat na kolejny wpis i pewnie wtedy, gdy będziemy mieli wersje finalną.

Podsumowanie

Mamy w SQL Server 2016  Temporal Table, pewnie wielu wymyśli od razu scenariusze dotyczące historii logowania, biznesowe obejmujące zmianę w czasie, czy też śledzenie zmian w wymiarach.. Zachęcam do badania, a już kolejna część Research SQL Server 2016CTP2 poświęcona będzie COLUMNSTORE INDEX.

Share this article ...

Google Plus
Ihren LinkedIn Kontakten zeigen



This entry was posted in General, SQL Server and tagged , , , by Lukasz Grala. Bookmark the permalink.
Lukasz Grala

About Lukasz Grala

A Data Platform and Business Intelligence architect and consultant. An authorized Microsoft trainer and university lecturer. A holder of numerous Microsoft certificates, since 2010 Microsoft Most Valuable Professional (MVP) in the SQL Server category. An author of articles and webcasts available on TechNet portal. He runs two blogs, SQL Research and PowerPivot’s Blog. The author of various trainings and a speaker at numerous IT conferences, as well as the Polish SQL Server User Group (PLSSUG) leader.

Leave a Reply

Connect with:
  • This field its required.
  • This field its required.
    • Message is required