jak szybko przetwarzasz hurtowe ilości xml?

Post on 13-Apr-2017

133 Views

Category:

Education

2 Downloads

Preview:

Click to see full reader

TRANSCRIPT

Jak szybko przetwarzasz hurtowe ilości XML?

Bartosz Ratajczykb.ratajczyk@gmail.com

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 | b.ratajczyk@gmail.com

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”

top related