ドキュメントによると、NUM_ROWSは「テーブルの行数」です。 、これがどのように混乱するかがわかります。ただし、これら2つの方法には大きな違いがあります。
このクエリは、システムビューからMY_TABLEの行数を選択します。これは、Oracleが以前に収集して保存したデータです。
select num_rows from all_tables where table_name = 'MY_TABLE'
このクエリは、MY_TABLEの現在の行数をカウントします
select count(*) from my_table
定義上、これらは異なるデータです。 NUM_ROWSについて必要な追加情報が2つあります。
-
ドキュメントには、列名のアスタリスクがあります。これは、このメモにつながります:
アスタリスク(*)でマークされた列は、ANALYZEステートメントまたはDBMS_STATSpackageを使用してテーブルの統計を収集した場合にのみ入力されます。
これは、テーブルの統計を収集しない限り、この列にはデータがないことを意味します。
-
デフォルトの
estimate_percent
を使用して11g以上で収集された統計 、または100%の見積もりでは、その時点の正確な数値が返されます。ただし、統計は11gより前、またはカスタムのestimate_percent
を使用して収集されました 100%未満で、動的サンプリングを使用しているため、正しくない可能性があります。 99.999%を収集すると、1つの行が失われる可能性があります。これは、得られる答えが正しくないことを意味します。
テーブルが決してない場合 更新すると、ALL_TABLES.NUM_ROWSを使用してテーブルの行数を確認することが確実に可能になります。 ただし 、そしてそれは大きなことですが、プロセスがテーブルに行を挿入または削除する場合、それはせいぜい適切な概算であり、データベースが統計を自動的に収集するかどうかによっては、ひどく間違っている可能性があります。
一般的に言えば、システムテーブルに依存するよりも、テーブル内の行数を実際にカウントする方が常に優れています。