Sql 为什么多个OrderBy需要花费大量的执行时间?
我尝试使用多个Sql 为什么多个OrderBy需要花费大量的执行时间?,sql,sql-server,sql-server-2008,Sql,Sql Server,Sql Server 2008,我尝试使用多个orderby 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
orderby
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已编制索引 试试这个-
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
试试这个-
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
要对查询结果进行排序,SQL Server会消耗CPU时间 ORDER BY子句尽可能快地将所有查询结果消耗到应用程序的内存中,然后进行排序 您的应用程序已经设计成可以扩展多个应用程序服务器以分配CPU负载的方式,而您的数据库服务器……则不是 排序操作除了使用TEMPDB系统数据库作为临时存储区域外,还为操作增加了很高的I/O速率
因此,如果您习惯于在查询中频繁地看到排序运算符,并且该运算符具有高消耗操作,请考虑删除所提到的子句。另一方面,如果你知道它总是通过一个专栏来组织你的查询,考虑索引它。
< P>排序你的查询结果,SQLServer会烧掉CPU时间。p> ORDER BY子句尽可能快地将所有查询结果消耗到应用程序的内存中,然后进行排序 您的应用程序已经设计成可以扩展多个应用程序服务器以分配CPU负载的方式,而您的数据库服务器……则不是 排序操作除了使用TEMPDB系统数据库作为临时存储区域外,还为操作增加了很高的I/O速率因此,如果您习惯于在查询中频繁地看到排序运算符,并且该运算符具有高消耗操作,请考虑删除所提到的子句。另一方面,如果你知道它总是通过一个特定的列来组织你的查询,考虑索引它。
秩列真的是VARCHAR。(我得到了这样的设计)。转换为int有任何问题(为此我在列中添加了0),您能否为您的表提供DDL
?当我将TBL_ContentsPage.PostedDate DESC
添加到order by子句时,会出现这种延迟。当我删除它时,效果会更好。尝试更改newsId
列的数据类型(INT[notnull]
),如果可能,还可以将rank
列设置为notnull
。rank列实际上是varchar。(我得到了这样的设计)。转换为int有任何问题(为此我在列中添加了0),您能否为您的表提供DDL
?当我将TBL_ContentsPage.PostedDate DESC
添加到order by子句时,会出现这种延迟。当我删除它时,效果会更好。尝试更改newsId
列的数据类型(INT[notnull]
),如果可能的话,还可以将rank
列设置为notnull
。如果对该列执行转换(例如在这里,以一种丑陋的方式转换为INT),则索引是无用的。你能改变模式吗?你能添加一个计算列,其中rank
已经转换为int
,并对其进行索引吗?如果你正在对该列执行转换(比如这里,以一种丑陋的方式转换为int),则索引是无用的。您是否能够更改模式?是否可以添加一个计算列,其中rank
已转换为int
,并对其进行索引?