SlideShare uses cookies to improve functionality and performance, and to provide you with relevant advertising. If you continue browsing the site, you agree to the use of cookies on this website. See our User Agreement and Privacy Policy.
SlideShare uses cookies to improve functionality and performance, and to provide you with relevant advertising. If you continue browsing the site, you agree to the use of cookies on this website. See our Privacy Policy and User Agreement for details.
Successfully reported this slideshow.
Activate your 14 day free trial to unlock unlimited reading.
1.
Jak szybko przetwarzasz hurtowe ilości XML?
Bartosz Ratajczyk
b.ratajczyk@gmail.com
2.
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
3.
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
5.
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)
11.
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
12.
SQLDay 2016
SSIS – XML Source (2)
http://blog.hoegaerden.be/2011/04/20/loading-complex-xml-using-ssis/
13.
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
15.
DEMO
Jak wygląda XSD z adnotacjami?
SQLDay 2016
16.
MAM XML W BAZIE, CO Z NIM MOGĘ ZROBIĆ?
SQLDay 2016
17.
SQLDay 2016
XML Shredding
• XML Shredding, czyli rozbijanie danych XML do
postaci relacyjnej
• OPENXML
• XQuery - .nodes()
18.
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
21.
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
26.
SQLDay 2016
XQuery
• Operatory TVF występują jeśli nie ma indeksów XML
• Extended Operator (UDX) sygnalizuje operację XQuery/XPath
27.
JAK TO PRZYSPIESZYĆ, BO WOLNO DZIAŁA?
Może jakieś indeksy pomogą?
SQLDay 2016
28.
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
34.
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
35.
DOBRE PRAKTYKI XQUERY
Jakich konstrukcji unikać, a jakich używać
SQLDay 2016
36.
SQLDay 2016
Dobre praktyki XQuery – czego unikać (1)
• Odwołań do węzłów-rodziców (parent axis)
37.
SQLDay 2016
Dobre praktyki XQuery – czego unikać (2)
• Wielokrotnego używania tej samej metody (wielokrotne
wyliczanie tego samego)
38.
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])
39.
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
41.
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”
0 likes
Be the first to like this
Views
Total views
311
On SlideShare
0
From Embeds
0
Number of Embeds
3
You have now unlocked unlimited access to 20M+ documents!
Unlimited Reading
Learn faster and smarter from top experts
Unlimited Downloading
Download to take your learnings offline and on the go
You also get free access to Scribd!
Instant access to millions of ebooks, audiobooks, magazines, podcasts and more.
Read and listen offline with any device.
Free access to premium services like Tuneln, Mubi and more.