我如何避免在这里出现过多的拨款警告?还是我什至需要担心呢?

时间:2019-07-10 08:50:55

标签: sql-server memory

我编写了一个存储过程,该存储过程期望VARCHAR表示XML格式的某些数据。这是一个相同的示例:

'<Documents><Filters><DocClasses><DocClass Value="QUO" /></DocClasses></Filters></Documents>'

我处理XML以填充表变量:

DECLARE @DocClassesFiltered        BIT
DECLARE @DocClasses                TABLE
       ([DocClass]                 VARCHAR(3)           PRIMARY KEY)
SET @DocClassesFiltered = 0

我使用的是sp_xml_preparedocument等,这是沼泽的标准,因此我不会通过记录在案。可以说我将其句柄保存在名为@idoc

的变量中

然后我按如下方式填充表变量:

IF EXISTS
  (SELECT TOP 1 1
     FROM OPENXML(@idoc, 'Documents/Filters/DocClasses/DocClass', 2)
             WITH([Value]          VARCHAR(3)     '@Value') [DAL])
  BEGIN
    SET @DocClassesFiltered = 1

    INSERT
      INTO @DocClasses
          ([DocClass])
    SELECT [Value]
      FROM OPENXML(@idoc, 'Documents/Filters/DocClasses/DocClass', 2)
              WITH([Value]          VARCHAR(3)     '@Value') [DAL]
  END

在“实际执行计划”输出中,产生警告 查询内存授予检测到“ ExcessiveGrant”,这可能会影响可靠性。资助金额 ....(等)

我的问题: 1)我什至需要为此担心吗? 2)如果可以,该如何避免?

1 个答案:

答案 0 :(得分:0)

我先计算行数,然后在TOP中使用结果,以防止出现过多拨款。显然,这导致SQL对所需的内存进行了更好的估计,并且“过量授权”警告“消失了”。

DECLARE @XMLFilterCount      INT

SELECT @XMLFilterCount = COUNT(1)
  FROM OPENXML(@idoc, 'Documents/Filters/DocClasses/DocClass', 2)
          WITH([Value]           VARCHAR(3)     '@Value') [DAL]
IF @XMLFilterCount > 0
  BEGIN
    SET @DocClassesFiltered = 1

    INSERT
      INTO @DocClasses
          ([DocClass])
    SELECT TOP (@XMLFilterCount) [Value]
      FROM OPENXML(@idoc, 'Documents/Filters/DocClasses/DocClass', 2)
              WITH([Value]          VARCHAR(3)     '@Value') [DAL]
  END
相关问题