Sql 在具有的子查询上计数(*)时,性能非常慢

Sql 在具有的子查询上计数(*)时,性能非常慢,sql,asp.net,sql-server,Sql,Asp.net,Sql Server,我需要知道查询返回的总行数,以便在网页中填充分页文本 我在SQL端进行分页以提高性能 使用下面的查询,我在15秒内获得了6560条记录,这对于我的需求来说是很慢的: 一, 使用此查询,我在1秒内得到相同的结果: 二, 如果我更改上述查询(2.)并将RowNumber的上限设置为大于6560的数字(count(*)的结果),查询将再次15秒运行 因此,我的问题是: -为什么问题是2。花费的时间更少,甚至行数限制实际上不限制子查询中的任何行? -有什么方法可以使用查询2。以我的优势获得总行数 Ty

我需要知道查询返回的总行数,以便在网页中填充分页文本

我在SQL端进行分页以提高性能

使用下面的查询,我在15秒内获得了6560条记录,这对于我的需求来说是很慢的:

一,

使用此查询,我在1秒内得到相同的结果:

二,

如果我更改上述查询(2.)并将RowNumber的上限设置为大于6560的数字(count(*)的结果),查询将再次15秒运行

因此,我的问题是: -为什么问题是2。花费的时间更少,甚至行数限制实际上不限制子查询中的任何行? -有什么方法可以使用查询2。以我的优势获得总行数


Ty all:)

这并不能完全回答您的问题,因为真正的答案在于视图定义和优化。这是为了回答有关行为的问题

COUNT(*)
之所以较慢,是因为它必须生成视图中的所有行,然后对它们进行计数。计数不是问题。这一代人是

ROW_NUMBER()over(order by pedidoid desc)
之所以快,是因为
pedidoid
上存在索引。SQL Server将索引用于
行编号()
。同样重要的是,它可以使用相同的索引访问视图中的数据。因此,这加快了查询速度

为什么会有一个神奇的数字6561。我不知道。这与SQL Server优化器和您的配置的反复无常有关。一种可能性与
WHERE
子句有关:

WHERE dataCriacaoPedido >= DATEADD(month, -6, getdate())
我的猜测是,有6560个匹配的条件。但是,SQL Server必须扫描整个表。它扫描表,找到匹配的值。但是,引擎不知道它已经完成了,因此它会继续搜索行。正如我所说,这是解释这种行为的推测


要真正修复查询,您需要了解视图是如何工作的。

这并不能完全回答您的问题,因为真正的答案在于视图定义和优化。这是为了回答有关行为的问题

COUNT(*)
之所以较慢,是因为它必须生成视图中的所有行,然后对它们进行计数。计数不是问题。这一代人是

ROW_NUMBER()over(order by pedidoid desc)
之所以快,是因为
pedidoid
上存在索引。SQL Server将索引用于
行编号()
。同样重要的是,它可以使用相同的索引访问视图中的数据。因此,这加快了查询速度

为什么会有一个神奇的数字6561。我不知道。这与SQL Server优化器和您的配置的反复无常有关。一种可能性与
WHERE
子句有关:

WHERE dataCriacaoPedido >= DATEADD(month, -6, getdate())
我的猜测是,有6560个匹配的条件。但是,SQL Server必须扫描整个表。它扫描表,找到匹配的值。但是,引擎不知道它已经完成了,因此它会继续搜索行。正如我所说,这是解释这种行为的推测


如果要真正修复查询,您需要了解视图是如何工作的。

@techspider有索引吗?也可能有助于解释这些查询的计划,以便您可以看到它所走的路线。您能否粘贴所涉及表的示例架构,indexes@MartinSmith完全正确,是我的错。嗨,大众汽车我猜你在质疑一个观点。我们可以查看视图的SQL吗?我同意如果这是一个视图,我们需要查看该表或视图中涉及的表的索引。如果该日期字段上没有索引,则不会有帮助。另外,请查看慢速查询和快速查询的执行计划。有什么区别?高成本在哪里?使用SET STATISTICS IO运行慢速查询和快速查询,时间在它之前。再说一遍,有什么区别。特定表上的磁盘读取量是否大幅增加?@techspider是否有索引?也可能有助于解释这些查询的计划,以便您可以看到它所走的路线。您能否粘贴所涉及表的示例架构,indexes@MartinSmith完全正确,是我的错。嗨,大众汽车我猜你在质疑一个观点。我们可以查看视图的SQL吗?我同意如果这是一个视图,我们需要查看该表或视图中涉及的表的索引。如果该日期字段上没有索引,则不会有帮助。另外,请查看慢速查询和快速查询的执行计划。有什么区别?高成本在哪里?使用SET STATISTICS IO运行慢速查询和快速查询,时间在它之前。再说一遍,有什么区别。特定表上的磁盘读取量是否会大幅增加?
WHERE dataCriacaoPedido >= DATEADD(month, -6, getdate())