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 server 2008 SQL Server:在rownum上从内部选择返回总和值_Sql Server 2008 - Fatal编程技术网

Sql server 2008 SQL Server:在rownum上从内部选择返回总和值

Sql server 2008 SQL Server:在rownum上从内部选择返回总和值,sql-server-2008,Sql Server 2008,我每天都在这个网站上,但我以前从未发布过。我很难理解为什么我的查询要花这么长时间 因为SQL Server不支持返回一系列行,所以我们不得不非常花哨,所以我们使用 SELECT FROM (SELECT ROW_NUMBER() AS rownum...) WHERE rownum BETWEEN foo AND bar] 声明 内部select在

我每天都在这个网站上,但我以前从未发布过。我很难理解为什么我的查询要花这么长时间

因为SQL Server不支持返回一系列行,所以我们不得不非常花哨,所以我们使用

SELECT FROM 
    (SELECT ROW_NUMBER() AS rownum...) 
WHERE rownum BETWEEN foo AND bar] 
声明

内部select在<1秒内返回约13000行(单独运行)。返回的列之一是来自联接表的
SUM()

外部选择大约需要14秒才能返回范围为500-1000的内部选择值。然而,如果我注释掉返回的总和,它需要<1秒-这是我所期望的

我的问题是,为什么只是在外部查询中返回该总和的操作需要这么长时间

下面的例子

完整查询示例(约14秒):

内部查询示例(<1秒):

示例完整查询,不返回总和(<1秒):


我会冒险做两次猜测,这也许可以解释这个问题

首先,在测量内部子查询时,您是在测量第一行出现之前的时间,还是在测量整个结果集出现之前的时间?我猜你在看第一排

我的第二个猜测是,您在yadayada和id上有一个索引。这意味着,仅使用索引就可以满足所有子查询。当包含附加列innerNum时,查询引擎实际上必须从其中一个表中读入页面

因此,整个查询的开销是两方面的组合:

  • 需要返回完整的结果集
  • 需要访问原始表中的页面

我可能已经完全不在状态了,但这可能会让您了解问题的原因。两个

行数
与out
OVER([PARTITION BY
子句!这将在“row_number”附近引发
错误语法,预期为“OVER”。
是-我知道。我们在查询中有它-它显然正在运行。这只是一个示例,但为了一致性,我现在将尝试更新它。-好的,我更新了示例以包含OVER语句。所有三个查询都是错误的。您可以n不将
yadayada
包含在select子句中,而不将其包含在group by子句中。谢谢你,danihp,我已经再次编辑了这些示例。但这仍然对我没有帮助。我正在寻找sql理论帮助。为什么实际查询运行得如此缓慢,而只是注释掉一点点,却像我预期的那样运行?我知道。但很难相信bizarre behavior reading syntax error samples。抱歉。很有意思…我不熟悉常用的表表达式-我必须仔细阅读。但是,这仍然存在相同的问题。使用此方法,左外连接需要11秒,内连接需要29秒,右外连接需要<1秒。嘿,你检查了这些表的索引了吗?事实上,我正在等待整个结果集与我的所有度量一起出现。我知道表上有索引,但我不知道哪些列被索引,甚至不知道如何检查。只需将表名复制到查询分析器中,选择该表名,然后按Alt+F1。谢谢大家的提示。我不知道我到底在看什么在F1成绩集上-我需要花更多的时间在上面,但我必须稍后再回来。现在我将标记这一个答案。谢谢你的帮助。
SELECT yadayada, number
FROM (SELECT yadayada, SUM(innerNum) AS number, 
          ROW_NUMBER() OVER (ORDER BY yadayada DESC) AS rownum
      FROM table1
      JOIN table2 ON table1.id = table2.id
      GROUP BY yadayada)
WHERE rownum BETWEEN 500 AND 1000
SELECT yadayada, SUM(innerNum) AS number, 
          ROW_NUMBER() OVER (ORDER BY yadayada DESC) AS rownum
FROM table1
JOIN table2 ON table1.id = table2.id
GROUP BY yadayada
SELECT yadayada --, number (commented out, still returned in inner query)
FROM (SELECT yadayada, SUM(innerNum) AS number, 
          ROW_NUMBER() OVER (ORDER BY yadayada DESC) AS rownum
      FROM table1
      JOIN table2 ON table1.id = table2.id
      GROUP BY yadayada)
WHERE rownum BETWEEN 500 AND 1000
Just try this:

;WITH CTE as 
(
SELECT yadayada, SUM(innerNum) AS number, 
          ROW_NUMBER() OVER (ORDER BY yadayada DESC) AS rownum
      FROM table1
      JOIN table2 ON table1.id = table2.id
      GROUP BY yadayada
)

select yadayada, number from CTE where rownum between 500 and 1000