首页 > 解决方案 > ALL_TABLES、count(*) 和 count(PRIMARY_KEY) 有什么区别?

问题描述

我正在使用 Oracle 数据库。这三个查询有什么区别?

select NUM_ROWS from ALL_TABLES where OWNER = 'ME' and TABLE_NAME = 'MY_TABLE'
select count(*) from ME.MY_TABLE
select count(PRIMARY_KEY) from ME.MY_TABLE

对于一个有 8500 万行的大表,ALL_TABLES查询需要 2 毫秒。 count(*)count(PRIMARY_KEY)花 5 秒时间。

附带问题:为什么 Oracle 数据库不ALL_TABLES使用count(*)or count(PRIMARY_KEY)

标签: sqldatabaseoraclecountinformation-schema

解决方案


NUM_ROWS从目录视图中查找列ALL_TABLES并不等同于实际计算表中的行数。它包含的信息基于上次在相关表上收集统计信息的时间(假设它们曾经是)。该文档指出仅当您使用 DBMS_STATS 包收集有关表的统计信息时才会填充它。这在您运行查询时(以及在哪个范围内)是否准确,很大程度上取决于您的统计收集策略和修改表的方式。

另一方面,其他两个查询是等效的,并为您提供表中的确切行数:

select count(*) from ME.MY_TABLE
select count(PRIMARY_KEY) from ME.MY_TABLE

第一个查询写得更好,并且可能比第二个查询更有效,因为它实际上不需要检查每一行上的列是否为空(尽管 Oracle 可能足够聪明,可以使用元数据来推断PK 列永远不会为空) - 当您的表具有多列主键时它也可以工作。


推荐阅读