sql - SQL 性能 - 如何避免因性能问题而从 XML 列读取 value

我是 SQL 的新手,您能否建议我如何改进以下 SQL 代码,我观察到使用 SQL Server Profiler - XML 读取操作花费了太多时间。

请让我知道如何重写以下代码,以便我可以看到性能的改进。

这里 - edata 是 XML 列,显示的代码是我的主要存储过程的一部分,只有下面的代码存在性能问题。并且 erequest table 已经被索引。

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 查询中重写上述行,以便我可以看到性能改进?

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

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

回答1

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

XML 索引的描述可以在https://docs.microsoft.com/en-us/sql/relational-databases/xml/xml-indexes-sql-server?view=sql-server-ver15&WT.mc_id=DP-MVP-5001259中找到。您将需要在 edata 列上使用 PRIMARY XML INDEX,然后我建议为 PROPERTY 使用 SECONDARY XML INDEX,这将有助于优化查询的 value() 组件。

相似文章

perl - cpan 模块安装失败,没有缺少先决条件

只是试图安装一个CPAN模块,似乎没有缺少任何先决条件,并且似乎找不到任何指向我需要做些什么来解决这个问题。有人可以理解问题可能是什么吗?除非我绝对确定它可能只是测试的问题,否则我宁愿不强制安装。我查...

php - PHP 导出到 XML 文件时缺少数据

我正在尝试将一些数据从数据库导出到XML文件,然后将文件发送到浏览器(可下载),我现在可以下载该文件,但有些数据丢失了!这是存在问题的代码部分:<?phpinclude('session.php');...

最新文章