由于性能问题,避免从 XML 列中读取值

问题描述 投票:0回答:1

我想改进以下 SQL 代码。我观察到使用 SQL Server Profiler - XML 读取操作花费了太多时间。

这里 -

edata
是 XML 列,显示的代码是我的主存储过程的一部分,只有下面的代码存在性能问题。并且
erequest
表已建立索引。

DECLARE @SFD TABLE 
( 
     etid    BIGINT, 
     eAmount DECIMAL(12, 2), 
     eDate   DATE
) 

INSERT INTO @SFD
    SELECT  
        tr.etid,
        tr.edata.value('(EData/Amount)[1]', 'DECIMAL(12, 2)') eAmount,
        tr.edata.value('(EData/DrawDate)[1]','date') eDate
    FROM    
        dbo.erequest tr
    WHERE  
        tr.accountid = @AccountId 

在上面的查询中,以下几行花费了太多时间:

tr.edata.value('(EData/Amount)[1]', 'DECIMAL(12, 2)') eAmount,
tr.edata.value('(EData/DrawDate)[1]','date') eDate

有人可以建议我如何重写主 SQL 查询中的上述几行,以便我可以看到性能改进吗?

请找到以下查询来填充表数据:

CREATE TABLE erequest
(
    etid BIGINT,
    edata XML,
    accountid INT
)

INSERT INTO erequest (etid, edata, accountid) 
VALUES (2145124897,
'<edata>
  <CardHolderName>ABCFDE</CardHolderName>
  <CardNumber>K6011</CardNumber>
  <Amount>555.17</Amount>
  <DrawDate>2022-05-18</DrawDate>
  <CurrencyCode>USD</CurrencyCode>
</edata>',10)

INSERT INTO erequest (etid, edata, accountid) 
VALUES (2145124897,
'<edata>
  <CardHolderName>ABCFDE</CardHolderName>
  <CardNumber>K6011</CardNumber>
  <Amount>555.17</Amount>
  <DrawDate>2022-05-18</DrawDate>
  <CurrencyCode>USD</CurrencyCode>
</edata>',20)

INSERT INTO erequest (etid, edata, accountid) 
VALUES (2145124897,
'<edata>
  <CardHolderName>ABCFDE</CardHolderName>
  <CardNumber>K6011</CardNumber>
  <Amount>555.17</Amount>
  <DrawDate>2022-05-18</DrawDate>
  <CurrencyCode>USD</CurrencyCode>
</edata>',30)

INSERT INTO erequest (etid, edata, accountid) 
VALUES (2145124897,
'<edata>
  <CardHolderName>ABCFDE</CardHolderName>
  <CardNumber>K6011</CardNumber>
  <Amount>555.17</Amount>
  <DrawDate>2022-05-18</DrawDate>
  <CurrencyCode>USD</CurrencyCode>
</edata>',12)

INSERT INTO erequest (etid, edata, accountid) 
VALUES (2145124897,
'<edata>
  <CardHolderName>ABCFDE</CardHolderName>
  <CardNumber>K6011</CardNumber>
  <Amount>555.17</Amount>
  <DrawDate>2022-05-18</DrawDate>
  <CurrencyCode>USD</CurrencyCode>
</edata>',16)

SELECT * FROM erequest
sql sql-server-2012 sqlperformance
1个回答
1
投票

您不需要重写查询,但您应该考虑使用 XML 索引。

可以在文档中找到 XML 索引的描述。您将需要在 edata 列上使用一个主 XML 索引,然后我建议为 PROPERTY 使用一个辅助 XML 索引,这将有助于优化查询的 value() 组件。

© www.soinside.com 2019 - 2024. All rights reserved.