问题:首先,通过SQL语句查询表的行数:
SQL> select owner, table_name,tablespace_name, num_rows,table_lock from dba_tables where table_name='OBJ$';
 
OWNER                          TABLE_NAME                     TABLESPACE_NAME                  NUM_ROWS TABLE_LOCK
------------------------------ ------------------------------ ------------------------------ ---------- ----------
SYS                            OBJ$                           SYSTEM                                    ENABLED发现NUM_ROWS没有值;然后, 直接查询表OBJ$
SQL> select OWNER# from OBJ$;
 
    OWNER#
----------
         0
         0
         0
         0
         0
         0发现存在记录。请社区对Oracle比较熟的朋友帮忙解释, 谢谢。

解决方案 »

  1.   

    不一致是正常的。这个不是实时更新的。只是你上次analyze时的值。
      

  2.   

    二楼正解,oracle 没有搜集表的统计信息
    用dbms_stats.gather_table_stats();
    oracle sql语句的执行计划就是根据这个统计信息来指定的,若是没有,oracle采用动态采样技术来选择基于CBO优化器的最小代价的执行计划
      

  3.   

    num_rows字段的值是在最后一次收集统计信息之后更新的。
    如果是频繁变化(批量变化)的表,这个字段的值极为不准确。
    如果数据量变化不频繁,这个字段的值也只是个大概数。