p__*_*__d 1 performance sql-server execution-plan concat query-performance
有什么办法可以优化FOR XML PATH
语句吗?或者也许我应该使用另一种方法?
目前的方法根本不可接受。这需要几分钟。我知道视图是一个非常大的联盟,需要时间来消耗它,但也许是另一种方式......
这是查询:
SELECT t.serialNumber as TVM
,[issuanceDate] as transactionDate
,ioy.tvmTransactionId as TVM_TRANS_ID
,STUFF((SELECT ', ' + stv.carrierSN
FROM HERMES.wts.v_SaleTransactionView as stv
WHERE stv.tvmTransactionId = ioy.tvmTransactionId
and stv.serialNumber = 'M040'
FOR XML PATH ('')), 1, 2, '') as [serial_numbers]
FROM [hermes].[wts].[IOYLog] ioy
left join Hermes.hermes.Terminals t on ioy.tp_terminalId = t.tp_terminalId
left join hermes.hermes.POS p on t.tp_POSId = p.tp_POSId
left join [Hermes].[wts].[IOUPaymentStatus] [is] on [is].[tp_paymentStatusId] = ioy.status
WHERE [is].includeInReports = 1
and (issuanceDate BETWEEN '2017/09/01' AND '2017/09/08') and (t.serialNumber = 'M040')
ORDER BY transactionDate
Run Code Online (Sandbox Code Playgroud)
在Sentry One Plan Explorer 中查看这一点,有四个主要的索引问题,所有这些问题都与隐藏一个昂贵的残差谓词的索引扫描有关:
以下四个索引将消除这些扫描并加速此执行计划:
--- Currently scanning 7 million rows to return 11
CREATE INDEX give_me_a_name
ON [wts].[Prepaid_TransactionLog]
([tvmTransactionId])
INCLUDE
(tp_terminalId, tp_POSId, status);
-- Currently scanning 21.5 million rows to return zero
CREATE INDEX give_me_a_name
ON [wts].[KBETicketTransactionLog]
([tvmTransactionId])
INCLUDE
(carrierSN, tp_terminalId, tp_POSId, status);
-- Currently scanning 6.25 million rows to return 12
CREATE INDEX give_me_a_name
ON [wts].[Intercity_TicketTransactionLog]
([tvmTransactionId])
INCLUDE
(formType, status, tp_terminalId, tp_POSId);
Run Code Online (Sandbox Code Playgroud)
第四个索引稍微复杂一些,因为键涉及integer
到 match的转换[wts].[IOYLog].[tvmTransactionId]
。这意味着要么改变现有列,要么提供一个计算列,如下所示:
-- New computed column, should be instant to add (metadata only)
ALTER TABLE [mazovian].[Transaction]
ADD [SequenceAsInteger] AS CONVERT(integer, [Sequence])
-- Currently scanning 61.6 million rows to return 70
CREATE INDEX give_me_a_name
ON [mazovian].[Transaction]
([SequenceAsInteger])
INCLUDE
(Id, Sequence, Terminal_id, Detail_id, Location_id);
Run Code Online (Sandbox Code Playgroud)
添加这四个索引应该会显着加快查询速度。与所有索引更改一样,您应该在决定部署之前在测试系统上对其进行评估。
您可以考虑许多其他小的索引改进来避免计划中的关键查找:
[status]
到现有索引[IOYLog].[IX_IOYLog_tp_terminalId_tvmTransactionId_issuanceDate_owedAmount]
carrierSN
, tp_POSId
, 和status
到索引[TransportTransactionLog].[IX_TransportTransactionLog_tp_terminalId_tvmTransaction_KK]
End_Status
到索引[Transaction_Distribution].[I_mazovian_Transaction_Distribution_Ticket_id]
归档时间: |
|
查看次数: |
6452 次 |
最近记录: |