Sql-Server
SQL Server / XML.query() 導致大量記憶體授予
以下(在我的系統上,在 SQL Server 2016 和 2019 std 上測試)產生大量記憶體授予請求(3327 MB)
declare @wibble xml = '<wibble><wobble>1</wobble></wibble>' select @wibble.query('//wobble[1]')
我可以做些什麼來減少補助金?
快速查看您的 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
該節點中的第一個。