sql >> Databáze >  >> RDS >> Sqlserver

XML Server Optimalizace výkonu XML

Mohu vám dát jednu odpověď a jeden odhad:

Nejprve použiji deklarovanou proměnnou tabulky k vysmívání váš scénář:

DECLARE @tbl TABLE(s NVARCHAR(MAX));
INSERT INTO @tbl VALUES
(N'<root>
    <SomeElement>This is first text of element1
        <InnerElement>This is text of inner element1</InnerElement>
        This is second text of element1
    </SomeElement>
    <SomeElement>This is first text of element2
        <InnerElement>This is text of inner element2</InnerElement>
        This is second text of element2
    </SomeElement>
</root>')
,(N'<root>
    <SomeElement>This is first text of elementA
        <InnerElement>This is text of inner elementA</InnerElement>
        This is second text of elementA
    </SomeElement>
    <SomeElement>This is first text of elementB
        <InnerElement>This is text of inner elementB</InnerElement>
        This is second text of elementB
    </SomeElement>
</root>');

--Tento dotaz přečte XML s vyřazením podvýběru . Můžete použít CTE místo toho, ale měl by to být pouze syntaktický cukr...

SELECT se.value(N'(.)[1]','nvarchar(max)') SomeElementsContent
      ,se.value(N'(InnerElement)[1]','nvarchar(max)') InnerElementsContent
      ,se.value(N'(./text())[1]','nvarchar(max)') ElementsFirstText
      ,se.value(N'(./text())[2]','nvarchar(max)') ElementsSecondText
FROM (SELECT CAST(s AS XML) FROM @tbl) AS tbl(TheXml)
CROSS APPLY TheXml.nodes(N'/root/SomeElement') AS A(se);

--Druhá část používá tabulku k zápisu zadaného XML a čtení odtud:

DECLARE @tbl2 TABLE(x XML)
INSERT INTO @tbl2
SELECT CAST(s AS XML) FROM @tbl;

SELECT se.value(N'(.)[1]','nvarchar(max)') SomeElementsContent
      ,se.value(N'(InnerElement)[1]','nvarchar(max)') InnerElementsContent
      ,se.value(N'(./text())[1]','nvarchar(max)') ElementsFirstText
      ,se.value(N'(./text())[2]','nvarchar(max)') ElementsSecondText
FROM @tbl2 t2
CROSS APPLY t2.x.nodes(N'/root/SomeElement') AS A(se);

Proč je /text() rychlejší než bez /text() ?

Když se podíváte na můj příklad, obsahem prvku je vše od úvodní značky až po závěrečnou značku . text() prvku je plovoucí text mezi těmito značkami. Můžete to vidět ve výsledcích výběru výše. text() je jedna samostatně uložená část ve stromové struktuře vlastně (přečtěte si další část). Načtení je jedním krokem . V opačném případě je nutné analyzovat složitou strukturu, aby bylo možné najít vše mezi úvodní značkou a odpovídající uzavírací značkou – i když neexistuje nic jiného než text() .

Proč bych měl ukládat XML ve vhodném typu?

XML není jen text s nějakými hloupými znaky navíc! Jde o dokument se složitou strukturou. XML není uložen jako text, který vidíte . XML je uloženo ve stromové struktuře. Kdykoli přenesete řetězec, který představuje XML, do skutečného XML, musí být provedena tato velmi nákladná práce. Když je vám předložen XML (nebo jakýkoli jiný výstup), reprezentující řetězec je (znovu) vytvořen od začátku.

Proč je přednastavený přístup rychlejší

To je hádání...
V mém příkladu jsou oba přístupy zcela rovnocenné a vedou k (téměř) stejnému exekučnímu plánu.
SQL Server nebude fungovat tak, jak byste to mohli očekávat. Toto není procesní systém, kde říkáte udělejte toto, než udělejte toto a poté udělejte toto! . Řeknete motoru, co chcete, a motor se rozhodne, jak to nejlépe udělat. A motor je s tím docela dobrý!
Před spuštěním se motor snaží odhadnout náklady na přístupy. CONVERT (nebo CAST ) je poměrně levná operace. Může se stát, že se engine rozhodne zpracovat seznam vašich hovorů a provést obsazení pro každou jednotlivou potřebu znovu a znovu, protože si myslí, že je to levnější než drahé vytváření odvozené tabulky...




  1. Jaká je ekvivalentní syntaxe PostgreSQL se syntaxí Oracle CONNECT BY ... START WITH?

  2. Structured Query Language – důležitost učení se SQL

  3. Analýza I/O výkonu pro SQL Server

  4. Jemné ladění Oracle DG40DBC