sql - 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)
?
解决方案
NUM_ROWS
从目录视图中查找列ALL_TABLES
并不等同于实际计算表中的行数。它包含的信息基于上次在相关表上收集统计信息的时间(假设它们曾经是)。该文档指出,仅当您使用 DBMS_STATS 包收集有关表的统计信息时才会填充它。这在您运行查询时(以及在哪个范围内)是否准确,很大程度上取决于您的统计收集策略和修改表的方式。
另一方面,其他两个查询是等效的,并为您提供表中的确切行数:
select count(*) from ME.MY_TABLE
select count(PRIMARY_KEY) from ME.MY_TABLE
第一个查询写得更好,并且可能比第二个查询更有效,因为它实际上不需要检查每一行上的列是否为空(尽管 Oracle 可能足够聪明,可以使用元数据来推断PK 列永远不会为空) - 当您的表具有多列主键时它也可以工作。
推荐阅读
- python - 获取数字列表的更快方法
- wordpress - 我可以在哪里编辑似乎不在代码中的 wordpress 文本?
- ruby-on-rails - 我无法在我的 Rails 应用程序中创建 manifest.json
- wordpress - Wordpress 回显或获取除最后 6 个字符外的单个帖子标题
- mongodb - 如何在 F# 中对 Mongo 集合进行排序
- javascript - 获取符号名称
- asp.net-mvc - 问题添加涉及在 ASP.NET MVC 5 中使用实体框架代码优先引用 ApplicationUser 的实体的迁移
- java - jlink 打包当前平台的二进制文件
- python-3.x - 在Python中在偶数x轴上不均匀地绘制多个箱形图
- android - 了解 Flutter 依赖和 Build.gradle 关系