jak szybko przetwarzasz hurtowe ilości xml?
TRANSCRIPT
Jak szybko przetwarzasz hurtowe ilości XML?
Bartosz [email protected]
SQLDay 2016
O czym będzie?
• O różnych technikach, które mogą się przydać przy przetwarzaniu XML w SQL Server
• Z naciskiem na sytuacje, kiedy tych danych jest dużo
Czyli:• Zasilanie SQL Server plikami XML (również o rozmiarach wielu GB)• XML Shredding• Indeksy XML• Dobre praktyki XQuery
SQLDay 2016
Bartosz Ratajczyk
Konsultant SQL Server związany z firmą 7N
Bardziej programista niż administrator
Udziela się na warszawskiej grupie PLSSUG
MCSE Data PlatformMCT
http://bartekr.net | [email protected]
SQLDay 2016
CHCĘ MIEĆ TE PLIKI W BAZIE
SQLDay 2016
Jak możemy zasilać dane XML
Przyjrzymy się trzem metodom:
• Z poziomu SQL Server: OPENROWSET• Z zewnątrz (np. skrypt Powershell)• SSIS (czyli też z zewnątrz)
SQLDay 2016
DEMOZasilmy dane
SQLDay 2016
Zasilanie małych plików
1000 5000 10000 15000 20000 250000
50
100
150
200
250
300
Invoke-SqlcmdOPENROWSETSSIS
Ilość plików
Czas
zasil
ania
w se
kund
ach
SQLDay 2016
Zasilanie dużych plików
• Ograniczenie rozmiaru XML do 2GB• Najlepiej zasilać przez OPENROWSET• Mocno wpływa na tempdb
SQLDay 2016
Jeszcze o OPENROWSET
https://msdn.microsoft.com/en-us/library/ms190312.aspx
SINGLE_CLOB == VARCHAR(MAX)SINGLE_NCLOB == NVARCHAR(MAX)SINGLE_BLOB == VARBINARY(MAX)
SQLDay 2016
NIE CHCĘ XML, CHCĘ SAME DANE
SQLDay 2016
SSIS – XML Source (1)
• Rozbijanie danych XML do postaci relacyjnej na podstawie XSD• Dla prostych plików jak znalazł• Wymaga XML w formie DOKUMENTU, nie umie obsłużyć
FRAGMENTÓW
SQLDay 2016
SSIS – XML Source (2)
http://blog.hoegaerden.be/2011/04/20/loading-complex-xml-using-ssis/
SQLDay 2016
SQLXML - czyli można też inaczej
• Przetwarza XML do postaci relacyjnej na podstawie XSD• Komponent COM instalowany niezależnie od SQL Server• Dostarczany przez Microsoft• Ma duże możliwości, ale też swoje ograniczenia (a jakże!)• Kontekstowy – obecny węzeł jest punktem odniesienia• Nie jest nachalny dla pamięci i daje radę dużym plikom• Dodatkowe adnotacje XSD
SQLDay 2016
Przykład użycia SQLXML - BulkLoad
SQLDay 2016
DEMOJak wygląda XSD z adnotacjami?
SQLDay 2016
MAM XML W BAZIE, CO Z NIM MOGĘ ZROBIĆ?
SQLDay 2016
XML Shredding
• XML Shredding, czyli rozbijanie danych XML do postaci relacyjnej• OPENXML• XQuery - .nodes()
SQLDay 2016
Ten stary, niedobry OPENXML
• sp_xml_preparedocument, sp_xml_removedocument
• Wycofywany/niezalecany• Umie przetworzyć tylko jeden dokument XML na raz• Wymaga zwalniania pamięci
https://msdn.microsoft.com/en-us/library/ms187367.aspx
SQLDay 2016
MEMOBJ_MSXML + CMEMTHREAD
http://speedysql.com/2015/02/04/cmemthread-and-sp_xml_removedocument
SQL Server 2012, 800GB RAM
SQLDay 2016
OPENXML
SQLDay 2016
Ten nowoczesny .nodes()
• Rozbija XML na rekordy (tak jak WITH w OPENXML)• Występuje razem z kolegami:
o .query()o .value()o .exist()
• Przyjaźni się bardzo z CROSS APPLY• Umie przetworzyć wiele dokumentów na raz• Zalecany model przetwarzania
Ale:• Ma problemy z szacowaniem ilości rekordów• Mówią, że jest wolniejszy od OPENXML
SQLDay 2016
Używamy .nodes()
SQLDay 2016
Przykład szacowania .nodes()
SQLDay 2016
XML A PLANY ZAPYTAŃ
SQLDay 2016
OPENXML
SQLDay 2016
XQuery• Operatory TVF występują jeśli nie ma indeksów XML• Extended Operator (UDX) sygnalizuje operację XQuery/XPath
SQLDay 2016
JAK TO PRZYSPIESZYĆ, BO WOLNO DZIAŁA?Może jakieś indeksy pomogą?
SQLDay 2016
PRIMARY XML INDEX
• Wymaga PRIMARY KEY CLUSTERED na tabeli z kolumną XML• Budowany jednym wątkiem (chociaż składnia dopuszcza MAXDOP)• Przebudowany wyłącznie OFFLINE• Nie obsługuje kompresji• Budowany na tych samych grupach plików co tabela
SQLDay 2016
Co taki indeks ma w środku?
SQLDay 2016
SECONDARY XML INDEX
Wymagają istnienia PRIMARY XML INDEX
SQLDay 2016
DEMOPrzyspieszamy z indeksami
SQLDay 2016
Ale czy naszego dysku to nie zaboli?
SQLDay 2016
SELECTIVE XML INDEX
SQLDay 2016
Wnioski po indeksowaniu
• Już sam PRIMARY XML INDEX potrafi przyspieszyć zapytanie (ale wcale nie musi)
• SECONDARY XML INDEX potrafi mocno wydłużyć zapytanie• Indeksy PRIMARY i SECONDARY zajmują dużo miejsca• Rozwiązaniem problemów może być SELECTIVE XML INDEX
SQLDay 2016
DOBRE PRAKTYKI XQUERYJakich konstrukcji unikać, a jakich używać
SQLDay 2016
Dobre praktyki XQuery – czego unikać (1)
• Odwołań do węzłów-rodziców (parent axis)
SQLDay 2016
Dobre praktyki XQuery – czego unikać (2)• Wielokrotnego używania tej samej metody (wielokrotne
wyliczanie tego samego)
SQLDay 2016
Dobre praktyki XQuery – co stosować
• Przy danych XML opartych na schemacie rzutować na typy schematu• Przy danych XML bez schematu porównywać dane jako tekst („”)
• Stosować podpowiedzi przy elementach głównych
(np. /root[1]/element zamiast /root/element)
• Jeśli ma to sens – używać całej ścieżki na raz
(np. (/a/b)[1] zamiast /a[1]/b[1])
SQLDay 2016
Nadmiar informacji dla optymalizatora
Warto rozważyć podejście Adama Machanica:
Zamiast stosować HINTS i wymuszać konkretne zachowania lepiej nakierować optymalizator na odpowiednie myślenie.
Przykład: przyspieszenie przetwarzania 300x
http://sqlblog.com/blogs/adam_machanic/archive/2010/01/12/t-sql-tuesday-002-is-it-xml-or-not.aspx
SQLDay 2016
DEMO30 000% normy
SQLDay 2016
Co dalej?
• Channel9 – Michael Rys „Troubleshooting common XQuery and XML problems in Microsoft SQL Server based on real world examples”
• Dmitri Korotkevich „Pro SQL Server Internals”• Kalen Delaney et. al. „SQL Server 2012 Internals”• Michael Coles „Pro SQL Server 2008 XML”