sql >> データベース >  >> RDS >> Oracle

count(*)によるテーブルのOracle行数とDBA_TABLESのNUM_ROWS

    ドキュメントによると、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つあります。

    1. ドキュメントには、列名のアスタリスクがあります。これは、このメモにつながります:

      アスタリスク(*)でマークされた列は、ANALYZEステートメントまたはDBMS_STATSpackageを使用してテーブルの統計を収集した場合にのみ入力されます。

      これは、テーブルの統計を収集しない限り、この列にはデータがないことを意味します。

    2. デフォルトのestimate_percentを使用して11g以上で収集された統計 、または100%の見積もりでは、その時点の正確な数値が返されます。ただし、統計は11gより前、またはカスタムのestimate_percentを使用して収集されました 100%未満で、動的サンプリングを使用しているため、正しくない可能性があります。 99.999%を収集すると、1つの行が失われる可能性があります。これは、得られる答えが正しくないことを意味します。

    テーブルが決してない場合 更新すると、ALL_TABLES.NUM_ROWSを使用してテーブルの行数を確認することが確実に可能になります。 ただし 、そしてそれは大きなことですが、プロセスがテーブルに行を挿入または削除する場合、それはせいぜい適切な概算であり、データベースが統計を自動的に収集するかどうかによっては、ひどく間違っている可能性があります。

    一般的に言えば、システムテーブルに依存するよりも、テーブル内の行数を実際にカウントする方が常に優れています。




    1. SQLiteクエリ結果で区切り文字をコンマに変更します

    2. 初心者向けのSQLNotEqual To(!=)演算子

    3. Androidの再発イベントの期間がNULLになるのはなぜですか?

    4. DBAが担当する9つの重要なタスク