首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >优化查询对于XML路径还是一些替代方案?

优化查询对于XML路径还是一些替代方案?
EN

Database Administration用户
提问于 2017-09-21 15:02:20
回答 1查看 8.1K关注 0票数 1

有没有优化FOR XML PATH语句的方法?还是我该换个方法?

目前的做法是完全不能接受的。只需要几分钟。我知道视图是一个很大的联盟,它需要时间去消耗,但也许是另一种方式.

以下是查询:

代码语言:javascript
复制
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

执行计划:https://www.brentozar.com/pastetheplan/?id=Sk7i98Wjb

EN

回答 1

Database Administration用户

回答已采纳

发布于 2017-09-23 06:08:40

哨兵一号计划探索者中,有四个主要的索引问题,它们都与索引扫描相关联,隐藏了昂贵的剩余谓词:

以下四个索引将消除这些扫描并加快执行计划:

代码语言:javascript
复制
--- 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);

第四个索引稍微复杂一些,因为键涉及到转换到integer以匹配[wts].[IOYLog].[tvmTransactionId]。这意味着要么更改现有列,要么按以下方式提供计算列:

代码语言:javascript
复制
-- 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);

添加这四个索引将显著加快查询速度。与所有索引更改一样,在决定部署之前,您应该在测试系统上评估它们。

为了避免计划中的关键查找,您还可以考虑其他一些小的索引改进:

  • [status]添加到现有索引[IOYLog].[IX_IOYLog_tp_terminalId_tvmTransactionId_issuanceDate_owedAmount]
  • carrierSNtp_POSIdstatus添加到索引[TransportTransactionLog].[IX_TransportTransactionLog_tp_terminalId_tvmTransaction_KK]
  • End_Status添加到索引[Transaction_Distribution].[I_mazovian_Transaction_Distribution_Ticket_id]
票数 5
EN
页面原文内容由Database Administration提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://dba.stackexchange.com/questions/186567

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档