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

セッションの変更により、Hibernateを介したクエリの速度が低下します

    UPPER()とBINARY_CIは同じ結果を生成する可能性がありますが、Oracleはそれらを互換的に使用することはできません。インデックスとBINARY_CIを使用するには、次のようなインデックスを作成する必要があります。

    create index src_nlssort_index on src(nlssort(b, 'nls_sort=''BINARY_CI'''));
    

    サンプルテーブルと混合ケースデータ

    create table src(b varchar2(100) not null);
    insert into src select 'MiXeD CAse '||level from dual connect by level <= 100000;
    

    デフォルトでは、upper()述語はupper()インデックスで範囲スキャンを実行できます

    create index src_upper_index on src(upper(b));
    
    explain plan for
    select * from src where upper(b) = 'MIXED CASE 1';
    
    select * from table(dbms_xplan.display(format => '-rows -bytes -cost -predicate 
        -note'));
    
    Plan hash value: 1533361696
    
    ------------------------------------------------------------------
    | Id  | Operation                   | Name            | Time     |
    ------------------------------------------------------------------
    |   0 | SELECT STATEMENT            |                 | 00:00:01 |
    |   1 |  TABLE ACCESS BY INDEX ROWID| SRC             | 00:00:01 |
    |   2 |   INDEX RANGE SCAN          | SRC_UPPER_INDEX | 00:00:01 |
    ------------------------------------------------------------------
    

    BINARY_CIとLINGUISTICはインデックスを使用しません

    alter session set nls_sort='binary_ci';
    alter session set nls_comp='linguistic';
    
    explain plan for
    select * from src where b = 'MIXED CASE 1';
    
    select * from table(dbms_xplan.display(format => '-rows -bytes -cost -note'));
    
    Plan hash value: 3368256651
    
    ---------------------------------------------
    | Id  | Operation         | Name | Time     |
    ---------------------------------------------
    |   0 | SELECT STATEMENT  |      | 00:00:02 |
    |*  1 |  TABLE ACCESS FULL| SRC  | 00:00:02 |
    ---------------------------------------------
    
    Predicate Information (identified by operation id):
    ---------------------------------------------------
    
       1 - filter(NLSSORT("B",'nls_sort=''BINARY_CI''')=HEXTORAW('6D69786564
                  2063617365203100') )
    

    NLSSORT()の関数ベースのインデックスにより、インデックス範囲のスキャンが可能になります

    create index src_nlssort_index on src(nlssort(b, 'nls_sort=''BINARY_CI'''));
    
    explain plan for
    select * from src where b = 'MIXED CASE 1';
    
    select * from table(dbms_xplan.display(format => '-rows -bytes -cost -note'));
    
    Plan hash value: 478278159
    
    --------------------------------------------------------------------
    | Id  | Operation                   | Name              | Time     |
    --------------------------------------------------------------------
    |   0 | SELECT STATEMENT            |                   | 00:00:01 |
    |   1 |  TABLE ACCESS BY INDEX ROWID| SRC               | 00:00:01 |
    |*  2 |   INDEX RANGE SCAN          | SRC_NLSSORT_INDEX | 00:00:01 |
    --------------------------------------------------------------------
    
    Predicate Information (identified by operation id):
    ---------------------------------------------------
    
       2 - access(NLSSORT("B",'nls_sort=''BINARY_CI''')=HEXTORAW('6D69786564
                  2063617365203100') )
    


    1. php値をjavaに保存します

    2. 毎日の差分値を取得するためのMySQLクエリ

    3. 単一のSQLテーブルに対する集計計算クエリ

    4. Doctrine2でMySQLカウント(*)を行うにはどうすればよいですか?