显示表中的行数时出现问题,Oracle表示11g DB

时间:2014-07-16 06:01:07

标签: sql oracle11g

我知道有两种方法可以显示不。第一行使用count() - 较慢,其他使用user_tables -quickie。

  

从user_tables中选择table_name,num_rows;

显示,4个表为空

TABLE_NAME  NUM_ROWS
TABLEP  
TABLEU  
TABLEN  
TABLE1  
TRANSLATE   26

select count(*) from tableu

给出,

COUNT(*)
6

这里有什么问题,我该怎么做才能更新user_tables /或者显示确切的no。的行。我已经尝试过发出commit语句。

2 个答案:

答案 0 :(得分:3)

num_rows不准确,因为它取决于最后一次运行DBMS_STATS包的时间:

exec dbms_stats.gather_schema_stats('ONWER NAME');

运行上述统计信息,然后重新运行查询。

答案 1 :(得分:2)

您不应该假设或期望num_rows中的user_tables是准确的行数。获得准确行数的唯一方法是对表进行count(*)

基于成本的优化器(CBO)使用

num_rows来提供推动查询计划的估算。对于生成查询计划的那些估计,实际值不需要特别准确 - 如果优化器错误地猜测操作将产生的行数为3或4,那么仍然可能是足够准确。在对表格收集统计数据时生成此估计值。通常,这种情况发生在深夜,并且仅在缺少(num_rows为NULL)或过时的表上(通常意味着自上次收集统计信息以来大约20%的行是新的或更新的)。即便如此,生成的值通常只是估计值,它们并不是100%准确。

可以在查询dbms_stats.gather_table_stats之前调用num_rows强制num_rows,并传递参数以生成完全准确的值。当然,这意味着gather_table_stats正在进行count(*)覆盖(加上额外的工作以收集其他统计信息),因此直接完成count(*)会更容易,更有效率首先。