添加ORDER BY子句使查询需要更长的时间才能完成

时间:2015-10-07 05:51:43

标签: sql sql-server

如果不添加ORDER BY RenewalDate,则需要1秒钟。在添加ORDER BY条款时,它花了2.22分钟。我对这个coloumn做了索引但没有改进性能.Pindex(非唯一,非群集)

如何在不降低性能的情况下使用ORDER BY子句。

RenewalDate (date, null) - 此列ORDER BY导致问题

查询:

select 
    LinkId,
    LinkName,
    CategoryId,
    ReportLinks
    SubmissionStatus,
    convert(nvarchar(18), LnkSubmsnDate) as LnkSubmsnDate,
    convert(nvarchar(18), LnkUpdateDate) as LnkUpdateDate,
    LnkSubmtdBy,
    K.KeyWord,
    RenewalDate
from tbl_Link L
left join Tbl_keywords K 
    on L.KeywordID = K.KeywordID
where 
    (SubmissionStatus = 'Approved' or SubmissionStatus = 'Waiting for Approval')
    and  LnkSubmtdBy ='swapna'
    and Convert(Char(4), LnkSubmsnDate, 100) in (
        select Convert(Char(4), LnkSubmsnDate, 100) 
        from tbl_Link
    )
order by 
    case when RenewalDate is null then 1 else 0 end,
    RenewalDate

3 个答案:

答案 0 :(得分:0)

你有这个问题,因为它是逐行检查RenewalDate,如果你想使用它,也许你可以在RenewalDate列中放一个索引。

    case when RenewalDate is null then 1 else 0 end,
    RenewalDate

答案 1 :(得分:0)

而不是:

and Convert(Char(4), LnkSubmsnDate, 100) in (
        select Convert(Char(4), LnkSubmsnDate, 100) 
        from tbl_Link

使用此:

and exists(
        select  (1)
        from tbl_Link TL
            where Convert(Char(4), TL.LnkSubmsnDate, 100) = Convert(Char(4), L.LnkSubmsnDate, 100))     

答案 2 :(得分:0)

您需要的是两个表上的唯一聚簇索引(在创建任何非聚集的indizes之前创建)。也许tbl_Link.LinkIdTbl_keywords.KeywordID是唯一聚集索引的候选者,可以分别作为主键。

第一次非聚集指数: tbl_Link.KeywordID上的一个是个好主意 - 因为它是您的JOIN列,您与表Tbl_keywords的连接。

进一步考虑索引列:

  • SubmissionStatus
  • LnkSubmtdBy
  • LnkSubmsnDate
  • RenewalDate

请注意:不支持指数只有在在聚集索引之后创建

时才会表现良好