1

我正在尝试执行以下 sql 查询,但执行需要 22 秒。返回的项目数是 554192。我需要加快速度,并且已经在所有涉及的表中放置了索引。

SELECT mc.name                           AS MediaName, 
       lcc.name                          AS Country, 
       i.overridedate                    AS Date, 
       oi.rating, 
       bl1.firstname + ' ' + bl1.surname AS Byline, 
       b.id                              BatchNo, 
       i.numinbatch                      ItemNumberInBatch, 
       bah.changedatutc                  AS BatchDate, 
       pri.code                          AS IssueNo, 
       pri.name                          AS Issue, 
       lm.neptunemessageid               AS MessageNo, 
       lmt.name                          AS MessageType, 
       bl2.firstname + ' ' + bl2.surname AS SourceFullName, 
       lst.name                          AS SourceTypeDesc 
FROM   profiles P 
       INNER JOIN profileresults PR 
               ON P.id = PR.profileid 
       INNER JOIN items i 
               ON PR.itemid = I.id 
       INNER JOIN batches b 
               ON b.id = i.batchid 
       INNER JOIN itemorganisations oi 
               ON i.id = oi.itemid 
       INNER JOIN lookup_mediachannels mc 
               ON i.mediachannelid = mc.id 
       LEFT OUTER JOIN lookup_cities lc 
                    ON lc.id = mc.cityid 
       LEFT OUTER JOIN lookup_countries lcc 
                    ON lcc.id = mc.countryid 
       LEFT OUTER JOIN itembylines ib 
                    ON ib.itemid = i.id 
       LEFT OUTER JOIN bylines bl1 
                    ON bl1.id = ib.bylineid 
       LEFT OUTER JOIN batchactionhistory bah 
                    ON b.id = bah.batchid 
       INNER JOIN itemorganisationissues ioi 
               ON ioi.itemorganisationid = oi.id 
       INNER JOIN projectissues pri 
               ON pri.id = ioi.issueid 
       LEFT OUTER JOIN itemorganisationmessages iom 
                    ON iom.itemorganisationid = oi.id 
       LEFT OUTER JOIN lookup_messages lm 
                    ON iom.messageid = lm.id 
       LEFT OUTER JOIN lookup_messagetypes lmt 
                    ON lmt.id = lm.messagetypeid 
       LEFT OUTER JOIN itemorganisationsources ios 
                    ON ios.itemorganisationid = oi.id 
       LEFT OUTER JOIN bylines bl2 
                    ON bl2.id = ios.bylineid 
       LEFT OUTER JOIN lookup_sourcetypes lst 
                    ON lst.id = ios.sourcetypeid 
WHERE  p.id = @profileID 
       AND b.statusid IN ( 6, 7 ) 
       AND bah.batchactionid = 6 
       AND i.statusid = 2 
       AND i.isrelevant = 1 

在查看执行计划时,我可以看到一个花费 42% 的步骤。有什么方法可以降低阈值,或者有什么方法可以提高整个查询的性能。

在此处输入图像描述

4

2 回答 2

2

删除配置文件表,因为它不需要并将 WHERE 子句更改为

WHERE  PR.profileid = @profileID

您在 batchactionhistory 表上有一个左外连接,但在 WHERE 子句中也有一个条件,该条件将其转换回内连接。将您的代码更改为:

LEFT OUTER JOIN batchactionhistory bah 
            ON b.id = bah.batchid
           AND bah.batchactionid = 6    

您不需要 batches 表,因为它用于连接可以直接连接的其他表,并在您的 SELECT 中显示 id,这在其他表中也可用。进行以下更改:

i.batchidid AS BatchNo, 

LEFT OUTER JOIN batchactionhistory bah 
           ON i.batchidid = bah.batchid 

是在包含大量数据但未编制索引的表中的连接或 WHERE 子句中使用的任何字段。如果是这样,请尝试在时间上向最大的表添加索引。

您是否需要结果中的每个字段 - 如果您可以丢失一个字段,或者您可能会进一步减少表的数量。

于 2013-04-16T12:38:03.033 回答
1

首先,如果这不是一个存储过程,那就让它成为一个。sql server 要编译的文本很多。

接下来,我的经验是“最坏的做法”有时是个好主意。具体来说,我已经能够通过将大查询分成几个或三个小查询并组合结果来提高性能。

如果此查询与 .net、coldfusion、java 等应用程序相关联,您也许可以在应用程序代码中进行拆分/重新组装。如果没有,临时表可能会派上用场。

于 2013-04-16T12:03:08.233 回答