我想改进以下 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
您不需要重写查询,但您应该考虑使用 XML 索引。
可以在文档中找到 XML 索引的描述。您将需要在 edata 列上使用一个主 XML 索引,然后我建议为 PROPERTY 使用一个辅助 XML 索引,这将有助于优化查询的 value() 组件。