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

Oracleのcount(1)とcount(*)の違い

    count(1)だと思います 以前のバージョンのOracleでは高速でした。しかし今では、オプティマイザーはcount(*)を知っているほど賢いと確信しています。 およびcount(1) 行数が必要で、適切な実行プランを作成することを意味します。

    どうぞ:

    create table t as select * from all_objects;
    
    Table T created.
    
    create index tindx on t( object_name );
    
    Index TINDX created.
    
    select count(*) from t;
    
      COUNT(*)
    ----------
         21534
    
    select * from table(dbms_xplan.display_cursor( NULL, NULL, 'allstats last' ));
    
    Plan hash value: 2940353011
    
    --------------------------------------------------------------------------------------------------
    | Id  | Operation             | Name  | Starts | E-Rows | A-Rows |   A-Time   | Buffers | Reads  |
    --------------------------------------------------------------------------------------------------
    |   0 | SELECT STATEMENT      |       |      1 |        |      1 |00:00:00.01 |     100 |     93 |
    |   1 |  SORT AGGREGATE       |       |      1 |      1 |      1 |00:00:00.01 |     100 |     93 |
    |   2 |   INDEX FAST FULL SCAN| TINDX |      1 |  18459 |  21534 |00:00:00.01 |     100 |     93 |
    --------------------------------------------------------------------------------------------------
    
    select count(1) from t;
    
      COUNT(1)
    ----------
         21534
    
    Plan hash value: 2940353011
    
    -----------------------------------------------------------------------------------------
    | Id  | Operation             | Name  | Starts | E-Rows | A-Rows |   A-Time   | Buffers |
    -----------------------------------------------------------------------------------------
    |   0 | SELECT STATEMENT      |       |      1 |        |      1 |00:00:00.01 |     100 |
    |   1 |  SORT AGGREGATE       |       |      1 |      1 |      1 |00:00:00.01 |     100 |
    |   2 |   INDEX FAST FULL SCAN| TINDX |      1 |  18459 |  21534 |00:00:00.01 |     100 |
    -----------------------------------------------------------------------------------------
    

    したがって、インデックスを使用してこのクエリを最適化できることを知っているだけでなく、異なるバージョンに対してまったく同じ実行プランを使用します(プランの値は同じです)。



    1. SQL Serverで参照エンティティを検索します:sys.dm_sql_referencing_entities()

    2. MySQLで数値テーブルを作成する

    3. java.lang.IllegalArgumentExceptionが発生するのはなぜですか。この場合、インデックス1のバインド値はnullです。

    4. MS SQLで過去30分間のレコードを取得するにはどうすればよいですか?