我知道有两种方法可以显示不。第一行使用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语句。
答案 0 :(得分:3)
num_rows
不准确,因为它取决于最后一次运行DBMS_STATS包的时间:
exec dbms_stats.gather_schema_stats('ONWER NAME');
运行上述统计信息,然后重新运行查询。
答案 1 :(得分:2)
您不应该假设或期望num_rows
中的user_tables
是准确的行数。获得准确行数的唯一方法是对表进行count(*)
。
num_rows
来提供推动查询计划的估算。对于生成查询计划的那些估计,实际值不需要特别准确 - 如果优化器错误地猜测操作将产生的行数为3或4,那么仍然可能是足够准确。在对表格收集统计数据时生成此估计值。通常,这种情况发生在深夜,并且仅在缺少(num_rows
为NULL)或过时的表上(通常意味着自上次收集统计信息以来大约20%的行是新的或更新的)。即便如此,生成的值通常只是估计值,它们并不是100%准确。
可以在查询dbms_stats.gather_table_stats
之前调用num_rows
强制num_rows
,并传递参数以生成完全准确的值。当然,这意味着gather_table_stats
正在进行count(*)
覆盖(加上额外的工作以收集其他统计信息),因此直接完成count(*)
会更容易,更有效率首先。