我尝试使用多个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
已被编入索引。
答案 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运算符,并且此运算符具有高消耗操作,请考虑删除上述子句。另一方面,如果您知道将始终按特定列组织查询,请考虑将其编入索引。