O czym będzie?
O przechowywaniu danych, które zmieniają się w czasie
Jak to obsługujemy teraz
Jak będziemy to mogli zrobić za pomocą Temporal Tables
Czy to ma sensowną wydajność?
Przydaje się?
O mnie
Bartosz Ratajczyk
Programista baz danych
(i aplikacji)
czasem też administrator
MCTS SQL Server 2008, MCSA SQL Server 2012, MCT
http://bartekr.net | b.ratajczyk@gmail.com
Dane zmienne w czasie
SYSTEM VERSIONING – zarejestrowano zmianę
BUSINESS VERSIONING – ważne biznesowo od - do
(Dane) ValidFrom ValidTo
(…) 2015-10-01 10:21:15 2015-10-10 18:11:24
(Dane) DateFrom DateTo
(…) 2015-10-01 2015-10-10
Dlaczego je przechowujemy?
Bo wymagają tego przepisy
Bo chcemy wiedzieć kiedy dane się zmieniły (audyt)
Bo chcemy znać poprzednie wersje danych (SCD)
Bo chcemy móc szybko przywrócić poprzednią wersję danych (oops!)
Bo nasze dane mają okres obowiązywania w czasie (cennik)
BO TAK! (BO TAK!)
Jak sobie radzimy teraz?
• Własna logika w aplikacji, procedury składowane, klauzula OUTPUT
• Wyzwalacze
• Change Tracking
• Change Data Capture
Nowa możliwość
Temporal Tables, czyli tabele z definicją OKRESU
Mechanizm samodzielny, bez zależności od innych komponentów
Automatycznie tworzy poprzednie wersje danych i dodaje nowe
Obsługuje tylko wersjonowanie systemowe
(co oczywiście nie wyklucza wersjonowania biznesowego we własnym
zakresie)
Testujemy wydajność
Zbiór wejściowy: 10 mln rekordów
Cztery zbiory pomocnicze po 1 mln rekordów losowane ze zbioru
wejściowego
Cztery kolejne operacje: UPDATE, DELETE, UPDATE, DELETE na zbiorze
wejściowym z wykorzystaniem zbiorów pomocniczych
Cztery zapytania sumujące dane w zbiorze wejściowym:
Sumowanie danych z wyszukiwaniem po kluczu głównym
Sumowanie danych z klauzulą AS OF z wyszukiwaniem po kluczu głównym
Sumowanie danych z wyszukiwaniem po kolumnie spoza PK
Sumowanie danych z klauzulą AS OF z wyszukiwaniem po kolumnie spoza PK
Trzy przypadki testowe – indeksy rowstore i columnstore
Czy to zajmie dużo miejsca?
3479
2560
355
454
90
98
0 500 1000 1500 2000 2500 3000 3500 4000 4500
Scenariusz 1: rowstore/rowstore
Scenariusz 2: rowstore/columnstore
Scenariusz 3: columnstore/columnstore
Zajętość dysku (MB)
Tabela główna Tabela historyczna
A szybkie to jest? (1)
1717
1762
498
0 200 400 600 800 1000 1200 1400 1600 1800 2000
Scenariusz 1: rowstore/rowstore
Scenariusz 2: rowstore/columnstore
Scenariusz 3: columnstore/columnstore
Czasy trwania operacjiUPDATE/DELETE (w sekundach)
Całkowity czas trwania
A szybkie to jest? (2)
220121
95120
841
0 50000 100000 150000 200000 250000
Scenariusz 1: rowstore/rowstore
Scenariusz 2: rowstore/columnstore
Scenariusz 3: columnstore/columnstore
Czasy zapytań (w milisekundach)
A szybkie to jest? (3)
907
231
102738
116246
664
284
51868
42304
454
263
63
61
0 20000 40000 60000 80000 100000 120000 140000
SELECT 1 (SUM, WHERE PK)
SELECT 2 (SUM, WHERE PK, AS OF)
SELECT 3 (SUM, WHERE)
SELECT 4 (SUM, WHERE, AS OF)
SELECT 1 (SUM, WHERE PK)
SELECT 2 (SUM, WHERE PK, AS OF)
SELECT 3 (SUM, WHERE)
SELECT 4 (SUM, WHERE, AS OF)
SELECT 1 (SUM, WHERE PK)
SELECT 2 (SUM, WHERE PK, AS OF)
SELECT 3 (SUM, WHERE)
SELECT 4 (SUM, WHERE, AS OF)
Scenariusz1:
rowstore/rowstore
Scenariusz2:
rowstore/columnstore
Scenariusz3:
columnstore/columnstore
Czasy zapytań (w milisekundach)
O czym jeszcze warto wspomnieć?
Możliwość odmiennego partycjonowania tabeli głównej i historycznej
Wsparcie dla In-Memory OLTP od wersji 3.0
Obecne ograniczenia
Nie można zrobić TRUNCATE TABLE
Nie można przełączyć partycji między tabelą główną a historyczną
Do historii trafiają wszystkie zmiany
(UPDATE T1 SET k = 1 WHERE k = 1)
Nie możemy ręcznie modyfikować danych historycznych
Nie możemy ustawić śledzenia zmian tylko dla części kolumn
Nie można przenieść danych historycznych do chmury (Stretch
Database)
Nie można używać wyzwalaczy INSTEAD OF
Nie wiadomo w których edycjach będzie dostępne
No dobrze, ale po co mi one?
Kolejne narzędzie do monitorowania zmian rekordów
Zgodne ze standardem SQL:2011
Szybsze od samodzielnych implementacji na wyzwalaczach
Gdzie poczytać więcej na ten temat?
Alex Volok – blog: http://www.alexvolok.com
Itzik Ben-Gan – artykuły na SQL Server Pro: http://sqlmag.com/sql-
server/first-look-system-versioned-temporal-tables-part-1-creating-
tables-and-modifying-data
Channel9 – nagranie o Temporal Tables + dyskusja pod nim
https://channel9.msdn.com/Shows/Data-Exposed/Temporal-in-SQL-
Server-2016
Dokumentacja – Books OnLine