Advertisement

Jak szybko przetwarzasz hurtowe ilości XML?

Database developer
May. 29, 2016
Advertisement

More Related Content

Similar to Jak szybko przetwarzasz hurtowe ilości XML?(20)

Advertisement

Jak szybko przetwarzasz hurtowe ilości XML?

  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
  4. CHCĘ MIEĆ TE PLIKI W BAZIE SQLDay 2016
  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)
  6. DEMO Zasilmy dane SQLDay 2016
  7. SQLDay 2016 Zasilanie małych plików 0 50 100 150 200 250 300 1000 5000 10000 15000 20000 25000 Czaszasilaniawsekundach Ilość plików Invoke-Sqlcmd OPENROWSET SSIS
  8. SQLDay 2016 Zasilanie dużych plików • Ograniczenie rozmiaru XML do 2GB • Najlepiej zasilać przez OPENROWSET • Mocno wpływa na tempdb
  9. 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)
  10. NIE CHCĘ XML, CHCĘ SAME DANE SQLDay 2016
  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
  14. SQLDay 2016 Przykład użycia SQLXML - BulkLoad
  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
  19. SQLDay 2016 MEMOBJ_MSXML + CMEMTHREAD http://speedysql.com/2015/02/04/cmemthread-and-sp_xml_removedocument SQL Server 2012, 800GB RAM
  20. SQLDay 2016 OPENXML
  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
  22. SQLDay 2016 Używamy .nodes()
  23. SQLDay 2016 Przykład szacowania .nodes()
  24. XML A PLANY ZAPYTAŃ SQLDay 2016
  25. SQLDay 2016 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
  29. SQLDay 2016 Co taki indeks ma w środku?
  30. SQLDay 2016 SECONDARY XML INDEX Wymagają istnienia PRIMARY XML INDEX
  31. DEMO Przyspieszamy z indeksami SQLDay 2016
  32. SQLDay 2016 Ale czy naszego dysku to nie zaboli?
  33. SQLDay 2016 SELECTIVE XML INDEX
  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
  40. DEMO 30 000% normy SQLDay 2016
  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”
Advertisement