SQL Server的行数

21 浏览
0 Comments

SQL Server的行数

如何在不扫描整个表的情况下计算或了解表中的行数,可以使用ROW_NUMBER吗?

0
0 Comments

在SQL Server中没有ROW_NUMBER函数,只有Oracle有。可以使用以下语句来计算行数:

SELECT COUNT(primary_key) FROM table

其中primary_key是表中的主键列。由于是主键,它已经被索引,所以SQL可以在不扫描整个表的情况下计算它(它使用的是一个聚集索引,比全表扫描要快得多)。

你也可以使用sys.indexes模式,但它不准确,并且你需要具有数据库管理员权限来访问,而你的应用程序数据库用户不应该在该模式下拥有授权。

COUNT(PK)实际上比COUNT(*)慢。

我非常怀疑这一点。你能提供一个样例代码,证明COUNT(PK)会慢一些吗?

我不明白为什么,因为在内部SQL使用主键索引来计算行数,然后使用COUNT(*)。如果相同的索引用于两个计数,性能应该相当相似,如果不是完全相同。

好的,我在这里看到了不同的意见,但是lists.mysql.com/maxdb/18486显示了一个例子。我错了- COUNT(ID)似乎是正确的选择(我甚至改变了所有的查询语句:()

好的,我刚刚在这个问题上多读了一些内容-根据你的模式,数据库管理系统和存储引擎选择COUNT(): mysqlperformanceblog.com/2007/04/10/count-vs-countcolstackoverflow.com/questions/2710621/…

SQL Server特定:Count(*)可以使用任何索引(非过滤的),并且会选择最窄的索引。Count(PK)必须使用具有主键的索引-但是,如果表是以该主键为聚集索引,那么主键将包含在每个非聚集索引中-所以SQL将仍然选择最窄的索引进行计数。

构建一个较慢的计算主键的示例的方法是,在非聚集主键中使用一个非常宽的列,与计算一个窄的非聚集非过滤索引进行计数。

- 这不是情况(你最后的评论)。COUNT(PK)在计划中只会出现为Count(*)。请尝试create table #foo(wide char(800) primary key nonclustered,narrow int); create nonclustered index ix on #foo(narrow); insert into #foo SELECT object_id, object_id FROM sys.objects; select COUNT(wide) from #foo;

你是对的,我需要测试一些例子来看看确切的优化情况 - 在你的例子select count(distinct wide) from #foo后面添加一行 - 我正在请求宽列中不同值的计数。查询计划显示它只访问foo.ix-我们知道该索引不包含这些值-所以它如何保证给出正确的答案?如果我去掉该列的主键方面,然后就从表中计数了。优化器通过说-如果它是主键,我知道它是唯一的,所以它与count(*)相同,再次使用最窄的索引-出人意料但聪明。

- 顺便说一句,我刚刚测试了一下,wide甚至不需要是主键。只要它被标记为NOT NULL,较窄的索引就会被使用。如果它是非空且唯一的(例如,主键),那么SQL Server也会对select COUNT(DISTINCT wide) from #foo;使用较窄的索引。

哎呀,我刚意识到我评论的第二部分只是重复了你已经说的!

0
0 Comments

问题:如何在SQL Server中获取表的行数?

原因:获取表的行数在某些情况下是很常见的需求,但是使用COUNT(*)方法会扫描聚集索引,这在大表中会导致性能问题。

解决方法:可以使用sys.partitions系统视图来获取表的行数,这种方法相对较快。以下是获取行数并将其存储到变量中的示例代码:

DECLARE @RowCount INT;
SELECT @RowCount = SUM(rows)
FROM sys.partitions
WHERE
  index_id IN (0, 1)
  AND object_id = OBJECT_ID('MyDB.dbo.MyTable');
SELECT @RowCount;

相比于扫描和统计1亿行的表,使用sys.partitions视图可以更快地获取行数,并且只需要从系统表中检索一个数字。这种方法可能只需要几百或几千个逻辑读取。

需要注意的是,使用sys.partitions视图获取的行数可能不是完全准确的,但在大多数情况下已经足够使用。

通过使用sys.partitions系统视图可以更快地获取表的行数,而不需要扫描整个表。这对于大表来说是一个有效的解决方案。

0
0 Comments

在SQL Server中,使用SELECT COUNT(*) FROM Table语句可以返回表中的行数。然而,有时候我们可能会遇到一些问题,导致无法正确地获取行数。下面将探讨这些问题的原因以及解决方法。

1. 表名错误:

确保在FROM子句中指定了正确的表名。如果表名拼写错误或者表不存在,将无法获取正确的行数。

2. 数据库错误:

如果数据库连接出现问题,可能会导致无法执行SQL查询。请确保数据库连接正常,并且您具有足够的权限来执行查询。

3. 行数过多:

如果表中的行数非常庞大,执行SELECT COUNT(*)可能会花费很长时间。在这种情况下,您可以考虑使用近似值来估计行数,以提高查询性能。

4. 数据库性能问题:

如果数据库服务器性能不佳,可能会导致查询执行缓慢。您可以通过优化数据库的索引、重新设计查询语句或者增加硬件资源来解决性能问题。

解决方法:

1. 检查表名是否正确,并确保表存在于数据库中。

2. 检查数据库连接是否正常,并确保您具有执行查询的权限。

3. 如果表中的行数过多,考虑使用近似值来估计行数。

4. 优化数据库性能,例如通过创建索引、重新设计查询语句或增加硬件资源来提高查询性能。

在SQL Server中,使用SELECT COUNT(*) FROM Table语句可以获取表中的行数。然而,由于一些原因,可能会导致无法正确地获取行数。通过检查表名、数据库连接、行数和数据库性能等方面,可以解决这些问题。优化数据库和查询性能也是提高查询效率的关键。

0