我是 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() 组件。