Sql-Server

SQL Server / XML.query() 導致大量記憶體授予

  • August 27, 2021

以下(在我的系統上,在 SQL Server 2016 和 2019 std 上測試)產生大量記憶體授予請求(3327 MB)

declare @wibble xml = '<wibble><wobble>1</wobble></wibble>'

select @wibble.query('//wobble[1]')

我可以做些什麼來減少補助金?

https://www.brentozar.com/pastetheplan/?id=HkezxS8-K

快速查看您的 xpath 表達式//wobble[1]和您所擁有的測試數據,您正在尋找wobble您可以找到的第一個。

甚至可以認為您的表達式等於(//wobble)[1]與您的測試數據給出相同結果的表達式。使用這樣的括號,您將從 XML 文件中獲得第一個wobble,並且不會為查詢授予記憶體。

因此,您可能知道使用//wobble[1](不帶括號)根本不一樣。此查詢將查看文件中的所有元素,如果其中有一個wobble元素,它將返回第一個元素並將結果與所有元素連接起來。

例如。

<wibble>
 <wobble>1</wobble>
 <wobble>2</wobble>
 <wobble>3</wobble>
 <wibble>
   <nowobblehere>X</nowobblehere>
   <wobble>A</wobble>
   <wobble>B</wobble>
   <wobble>C</wobble>
 </wibble>
</wibble>

使用//wobble[1]你會得到

<wobble>1</wobble>
<wobble>A</wobble>

在哪裡使用(//wobble)[1]只會給你<wobble>1</wobble>

如果您真的需要連接的結果,您可以粉碎您的節點,然後重建它們for xml path以獲得更小的記憶體授權。對我來說,它要求 1MB 而不是 280MB。仍然帶有過多記憶體授予的警告。

select T.X.query('wobble[1]')
from @wibble.nodes('//*[wobble]') as T(X)
for xml path('');

//*[wobble]為您提供具有wobble節點的所有節點,並wobble[1]為您提供wobble該節點中的第一個。

引用自:https://dba.stackexchange.com/questions/298655