jak szybko przetwarzasz hurtowe ilości xml?

43
Jak szybko przetwarzasz hurtowe ilości XML? Bartosz Ratajczyk [email protected]

Upload: bartosz-ratajczyk

Post on 13-Apr-2017

133 views

Category:

Education


2 download

TRANSCRIPT

Page 1: Jak szybko przetwarzasz hurtowe ilości XML?

Jak szybko przetwarzasz hurtowe ilości XML?

Bartosz [email protected]

Page 2: Jak szybko przetwarzasz hurtowe ilości XML?
Page 3: Jak szybko przetwarzasz hurtowe ilości XML?

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

Page 4: Jak szybko przetwarzasz hurtowe ilości XML?

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]

Page 5: Jak szybko przetwarzasz hurtowe ilości XML?

SQLDay 2016

CHCĘ MIEĆ TE PLIKI W BAZIE

Page 6: Jak szybko przetwarzasz hurtowe ilości XML?

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)

Page 7: Jak szybko przetwarzasz hurtowe ilości XML?

SQLDay 2016

DEMOZasilmy dane

Page 8: Jak szybko przetwarzasz hurtowe ilości XML?

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

Page 9: Jak szybko przetwarzasz hurtowe ilości XML?

SQLDay 2016

Zasilanie dużych plików

• Ograniczenie rozmiaru XML do 2GB• Najlepiej zasilać przez OPENROWSET• Mocno wpływa na tempdb

Page 10: Jak szybko przetwarzasz hurtowe ilości XML?

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)

Page 11: Jak szybko przetwarzasz hurtowe ilości XML?

SQLDay 2016

NIE CHCĘ XML, CHCĘ SAME DANE

Page 12: Jak szybko przetwarzasz hurtowe ilości XML?

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

Page 13: Jak szybko przetwarzasz hurtowe ilości XML?

SQLDay 2016

SSIS – XML Source (2)

http://blog.hoegaerden.be/2011/04/20/loading-complex-xml-using-ssis/

Page 14: Jak szybko przetwarzasz hurtowe ilości XML?

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

Page 15: Jak szybko przetwarzasz hurtowe ilości XML?

SQLDay 2016

Przykład użycia SQLXML - BulkLoad

Page 16: Jak szybko przetwarzasz hurtowe ilości XML?

SQLDay 2016

DEMOJak wygląda XSD z adnotacjami?

Page 17: Jak szybko przetwarzasz hurtowe ilości XML?

SQLDay 2016

MAM XML W BAZIE, CO Z NIM MOGĘ ZROBIĆ?

Page 18: Jak szybko przetwarzasz hurtowe ilości XML?

SQLDay 2016

XML Shredding

• XML Shredding, czyli rozbijanie danych XML do postaci relacyjnej• OPENXML• XQuery - .nodes()

Page 19: Jak szybko przetwarzasz hurtowe ilości XML?

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

Page 20: Jak szybko przetwarzasz hurtowe ilości XML?

SQLDay 2016

MEMOBJ_MSXML + CMEMTHREAD

http://speedysql.com/2015/02/04/cmemthread-and-sp_xml_removedocument

SQL Server 2012, 800GB RAM

Page 21: Jak szybko przetwarzasz hurtowe ilości XML?

SQLDay 2016

OPENXML

Page 22: Jak szybko przetwarzasz hurtowe ilości XML?

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

Page 23: Jak szybko przetwarzasz hurtowe ilości XML?

SQLDay 2016

Używamy .nodes()

Page 24: Jak szybko przetwarzasz hurtowe ilości XML?

SQLDay 2016

Przykład szacowania .nodes()

Page 25: Jak szybko przetwarzasz hurtowe ilości XML?

SQLDay 2016

XML A PLANY ZAPYTAŃ

Page 26: Jak szybko przetwarzasz hurtowe ilości XML?

SQLDay 2016

OPENXML

Page 27: Jak szybko przetwarzasz hurtowe ilości XML?

SQLDay 2016

XQuery• Operatory TVF występują jeśli nie ma indeksów XML• Extended Operator (UDX) sygnalizuje operację XQuery/XPath

Page 28: Jak szybko przetwarzasz hurtowe ilości XML?

SQLDay 2016

JAK TO PRZYSPIESZYĆ, BO WOLNO DZIAŁA?Może jakieś indeksy pomogą?

Page 29: Jak szybko przetwarzasz hurtowe ilości XML?

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

Page 30: Jak szybko przetwarzasz hurtowe ilości XML?

SQLDay 2016

Co taki indeks ma w środku?

Page 31: Jak szybko przetwarzasz hurtowe ilości XML?

SQLDay 2016

SECONDARY XML INDEX

Wymagają istnienia PRIMARY XML INDEX

Page 32: Jak szybko przetwarzasz hurtowe ilości XML?

SQLDay 2016

DEMOPrzyspieszamy z indeksami

Page 33: Jak szybko przetwarzasz hurtowe ilości XML?

SQLDay 2016

Ale czy naszego dysku to nie zaboli?

Page 34: Jak szybko przetwarzasz hurtowe ilości XML?

SQLDay 2016

SELECTIVE XML INDEX

Page 35: Jak szybko przetwarzasz hurtowe ilości XML?

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

Page 36: Jak szybko przetwarzasz hurtowe ilości XML?

SQLDay 2016

DOBRE PRAKTYKI XQUERYJakich konstrukcji unikać, a jakich używać

Page 37: Jak szybko przetwarzasz hurtowe ilości XML?

SQLDay 2016

Dobre praktyki XQuery – czego unikać (1)

• Odwołań do węzłów-rodziców (parent axis)

Page 38: Jak szybko przetwarzasz hurtowe ilości XML?

SQLDay 2016

Dobre praktyki XQuery – czego unikać (2)• Wielokrotnego używania tej samej metody (wielokrotne

wyliczanie tego samego)

Page 39: Jak szybko przetwarzasz hurtowe ilości XML?

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])

Page 40: Jak szybko przetwarzasz hurtowe ilości XML?

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

Page 41: Jak szybko przetwarzasz hurtowe ilości XML?

SQLDay 2016

DEMO30 000% normy

Page 42: Jak szybko przetwarzasz hurtowe ilości XML?

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”

Page 43: Jak szybko przetwarzasz hurtowe ilości XML?