为什么多个OrderBy需要花费很多时间来执行?

时间:2013-09-25 07:09:30

标签: sql sql-server sql-server-2008

我尝试使用多个ORDER BY

从表中查询
SELECT TOP 50
  TBL_ContentsPage.NewsId,
  TBL_ContentsPage.author,
  TBL_ContentsPage.Header,
  TBL_ContentsPage.TextContent,
  TBL_ContentsPage.PostedDate,
  TBL_ContentsPage.status,
  TBLTempSettings.templateID
FROM TBL_ContentsPage
INNER JOIN TBLTempSettings
  ON TBL_ContentsPage.NewsId = TBLTempSettings.newsId
WHERE TBL_ContentsPage.mode = '1' AND TBLTempSettings.mode = '1' AND (TBLTempSettings.templateID = @templateID OR @templateID = 'all')
ORDER BY 0 + TBLTempSettings.rank DESC

但是当我添加TBL_ContentsPage.PostedDate DESC时,查询需要的时间超过两倍。 TBLTempSettings.rank已被编入索引。

2 个答案:

答案 0 :(得分:2)

试试这个 -

SELECT TOP 50   c.newsId
            ,   c.author
            ,   c.Header
            ,   c.TextContent
            ,   c.PostedDate
            ,   c.status
            ,   t.templateID
FROM TBL_ContentsPage c
JOIN (
    SELECT *
    FROM TBLTempSettings t
    WHERE t.mode = '1'
        AND (t.templateID = @templateID OR @templateID = 'all')
) t ON c.newsId = CAST(t.newsId AS INT)
WHERE c.mode = '1'
ORDER BY t.rank DESC

答案 1 :(得分:2)

要对查询结果进行排序,SQL Server会占用CPU时间。

ORDER BY子句 会尽快将所有查询结果消耗到应用程序的内存中,然后排序。

您的应用程序的设计方式是可以扩展多个应用服务器以分配CPU负载,而数据库服务器则不是。

排序操作除了将TEMPDB系统数据库用于临时存储区域外,还为操作添加了很高的I / O速率。

因此,如果您习惯在查询中经常查看Sort运算符,并且此运算符具有高消耗操作,请考虑删除上述子句。另一方面,如果您知道将始终按特定列组织查询,请考虑将其编入索引。