O seguinte (nos meus sistemas, testado no SQL Server 2016 e 2019 std) produz uma solicitação de concessão de memória massiva (3327 MB)
declare @wibble xml = '<wibble><wobble>1</wobble></wibble>'
select @wibble.query('//wobble[1]')
Existe alguma coisa que eu possa fazer para reduzir o subsídio?
Com uma rápida olhada em sua expressão xpath
//wobble[1]
e os dados de teste que você tem, você está procurando o primeirowobble
que pode encontrar.Pode-se até pensar que sua expressão é igual a esta
(//wobble)[1]
que com seus dados de teste dá o mesmo resultado. Usando os parênteses assim, você obterá o primeirowobble
do documento XML e não haverá concessão de memória para a consulta.Então, como você deve saber, usar
//wobble[1]
(sem os parênteses) não é a mesma coisa. Essa consulta examinará todos os elementos do documento e, se houver umwobble
elemento, retornará o primeiro e concatenará o resultado com todos os elementos.Por exemplo.
Usando
//wobble[1]
você teráOnde usar
(//wobble)[1]
só lhe daria<wobble>1</wobble>
.Se você realmente precisar do resultado concatenado, poderá destruir seus nós e reconstruí-los usando
for xml path
para obter uma concessão de memória menor. Para mim, solicita 1 MB em vez de 280 MB. Ainda com um aviso de concessão de memória excessiva.//*[wobble]
fornece todos os nós que possuem umwobble
nó ewobble[1]
fornece o primeirowobble
nesse nó.Considere sugerir a consulta com MAX_GRANT_PERCENT:-
Documentado aqui:- https://support.microsoft.com/en-us/kb/3107401