Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/sql-server-2008/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 为什么多个OrderBy需要花费大量的执行时间?_Sql_Sql Server_Sql Server 2008 - Fatal编程技术网

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
,并对其进行索引?