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 Platform
MCT
http://bartekr.net | b.ratajczyk@gmail.com
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
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
MAM XML W BAZIE, CO Z NIM MOGĘ ZROBIĆ?
SQLDay 2016
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
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
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
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 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
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”