sql中的脚本优化

问题描述 投票:0回答:2

我正在运行简单的选择脚本,其中内部连接与其他3个表。所有表格都很大(大量数据),大约需要20秒才能运行。想要优化它。

我试图使用nolock,但没有太多的尊重

SELECT RR.ReportID,
       RR.RequestFormat,
       RRP.SequenceNumber,
       RRP.ParameterName,
       RRP.ParameterValue
       CASE WHEN RP.ParameterLabelOvrrd IS NULL THEN P.ParameterLabel ELSE .ParameterLabelOvrrd END AS ParameterLabelChosen,
       RRP.ParameterValueEntered
FROM ReportRequestParameters AS RRP WITH (NOLOCK)
     INNER JOIN ReportRequests AS RR WITH (NOLOCK) ON RRP.RequestID = RR.RequestID
     INNER JOIN ReportParameter AS RP WITH (NOLOCK) ON RP.ReportID = RR.ReportID
                                                   AND RP.SequenceNumber = RRP.SequenceNumber
     INNER JOIN Parameter AS P WITH (NOLOCK) ON P.ParameterID = RP.ParameterID
WHERE RRP.RequestID = '2226765'
ORDER BY SequenceNumber;

请指教。

sql sql-server
2个回答
1
投票

这是您的查询:

SELECT RR.ReportID, RR.RequestFormat, RRP.SequenceNumber, 
       RRP.ParameterName,  RRP.ParameterValue 
       COALESCE(RP.ParameterLabelOvrrd, P.ParameterLabel) as ParameterLabelChosen,
       RRP.ParameterValueEntered
FROM ReportRequestParameters RRP JOIN
     ReportRequests RR 
     ON  RRP.RequestID = RR.RequestID JOIN
     ReportParameter RP 
     ON RP.ReportID = RR.ReportID AND
        RP.SequenceNumber = RRP.SequenceNumber JOIN
     Parameter P 
     ON P.ParameterID = RP.ParameterID
WHERE RRP.RequestID = 2226765
ORDER BY RRP.SequenceNumber;

我已经删除了2226765上的单引号,假设id是一个数字。混合类型可能会阻碍优化器。

然后,我推荐一个关于ReportRequestParameters(RequestID, SequenceNumber)的索引。我假设其他表在适当的列上有索引,但它们是:

  • ReportRequests(RequestID, ReportID, SequenceNumber)
  • ReportParameter(ReportID, SequenceNumber, ParameterID)
  • Parameter(ParameterID)

我强烈建议你不要使用nolock,除非你知道你在做什么。 Aaron Bertrand在这个问题上有一个很好的blog post


0
投票

我建议运行执行计划,看看SSMS是否可以建议你进行额外的索引。

除了你的查询直截了当之外,没有任何代码可以帮助使它更快,除了可能摆脱case语句并且绝对摆脱NOLOCK语句。

© www.soinside.com 2019 - 2024. All rights reserved.