ube*_*oke 7 xml sql-server xquery memory-grant
以下(在我的系统上,在 SQL Server 2016 和 2019 std 上测试)产生大量内存授予请求(3327 MB)
declare @wibble xml = '<wibble><wobble>1</wobble></wibble>'
select @wibble.query('//wobble[1]')
Run Code Online (Sandbox Code Playgroud)
我可以做些什么来减少补助金?
Mik*_*son 14
快速查看您的 xpath 表达式//wobble[1]
和测试数据,您正在寻找第一个wobble
可以找到的数据。
人们甚至可以认为您的表达式与此相同,这(//wobble)[1]
与您的测试数据给出了相同的结果。使用这样的括号,您将从wobble
XML 文档中获得第一个,并且不会为查询授予内存。
因此,您可能知道使用//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>
Run Code Online (Sandbox Code Playgroud)
使用//wobble[1]
你会得到
<wobble>1</wobble>
<wobble>A</wobble>
Run Code Online (Sandbox Code Playgroud)
在哪里使用(//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('');
Run Code Online (Sandbox Code Playgroud)
//*[wobble]
为您提供具有wobble
节点的所有节点,并wobble[1]
为您提供wobble
该节点中的第一个节点。
归档时间: |
|
查看次数: |
591 次 |
最近记录: |