看起来count(*)比NUM_ROWS慢.该领域的专家能否对此有所了解.
Ben*_*Ben 23
根据文档 NUM_ROWS是"表中的行数",所以我可以看到这可能会令人困惑.然而,这两种方法之间存在重大差异.
此查询从系统视图中选择MY_TABLE中的行数.这是Oracle先前收集和存储的数据.
select num_rows from all_tables where table_name = 'MY_TABLE'
Run Code Online (Sandbox Code Playgroud)
此查询计算MY_TABLE中的当前行数
select count(*) from my_table
Run Code Online (Sandbox Code Playgroud)
根据定义,它们是不同的数据.您需要有关于NUM_ROWS的其他两条信息.
在文档中,列名称有一个星号,这导致了这个注释:
仅当您使用ANALYZE语句或DBMS_STATS包收集有关表的统计信息时,才会填充标有星号(*)的列.
这意味着除非您已在表上收集统计信息,否则此列将不包含任何数据.
以11g +收集的默认值estimate_percent或100%估计值的统计数据将返回该时间点的准确数字.但是在11g之前收集的统计数据,或者使用estimate_percent低于100%的自定义值,使用动态采样并且可能不正确.如果您收集99.999%可能会错过单行,这反过来意味着您获得的答案不正确.
如果您的表永远不会更新,那么肯定可以使用ALL_TABLES.NUM_ROWS来查找表中的行数.然而,它是一个很大的,但如果任何进程从您的表中插入或删除行,它最多将是一个很好的近似值,并取决于您的数据库是否自动收集统计信息可能是非常错误的.
一般来说,实际计算表中的行数而不是依赖于系统表总是更好.