所有表、count(*)和count(主键)之间有什么区别?

mwngjboj  于 2021-07-24  发布在  Java
关注(0)|答案(1)|浏览(371)

我正在使用oracle数据库。这3个查询之间有什么区别?

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(*) 或者 count(PRIMARY_KEY) ?

klsxnrf1

klsxnrf11#

查找列 NUM_ROWS 从目录视图 ALL_TABLES 不等于实际计算表中的行数。它包含的信息是基于上一次在相关表中收集统计数据的时间(假设曾经收集过)。文档说明,只有在使用dbms\u stats包收集表上的统计信息时,才会填充它。在运行查询时(以及在哪个扩展中),这是否准确在很大程度上取决于统计数据收集策略和表的修改方式。
另一方面,另外两个查询是等价的,它们为您提供了表中确切的行数:

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

第一个查询编写得更好,可能比第二个查询更有效,因为它实际上不需要检查每一行上的列是否为空(尽管oracle可能非常聪明,可以使用元数据推断pk列从不为空),而且当表具有多列主键时,它也可以工作。

相关问题