我正在使用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)
?
1条答案
按热度按时间klsxnrf11#
查找列
NUM_ROWS
从目录视图ALL_TABLES
不等于实际计算表中的行数。它包含的信息是基于上一次在相关表中收集统计数据的时间(假设曾经收集过)。文档说明,只有在使用dbms\u stats包收集表上的统计信息时,才会填充它。在运行查询时(以及在哪个扩展中),这是否准确在很大程度上取决于统计数据收集策略和表的修改方式。另一方面,另外两个查询是等价的,它们为您提供了表中确切的行数:
第一个查询编写得更好,可能比第二个查询更有效,因为它实际上不需要检查每一行上的列是否为空(尽管oracle可能非常聪明,可以使用元数据推断pk列从不为空),而且当表具有多列主键时,它也可以工作。