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

インデックス付きの数値列に「like」を使用したOracleクエリ、パフォーマンスの低下

    LIKEパターンマッチング条件 文字タイプが左側と右側の両方のオペランドとして表示されることを期待しています。 NUMBERに遭遇すると、暗黙的にcharに変換します。クエリ1は、基本的にサイレントに次のように書き直されます。

    SELECT a1.*
      FROM people a1
     WHERE TO_CHAR(a1.id) LIKE '119%'
       AND ROWNUM < 5
    

    それはあなたの場合に起こります、そしてそれは2つの理由で悪いです:

    1. 変換はすべての行に対して実行されますが、時間がかかります。
    2. WHERE述語の関数(暗黙的ではありますが)のため、OracleはA1.IDのインデックスを使用できません。 列。

    これを回避するには、次のいずれかを実行する必要があります。

    1. 関数ベースのインデックス を作成します A1.IDに 列:

      CREATE INDEX people_idx5 ON people (TO_CHAR(id));

    2. ID列の最初の3文字のレコードを照合する必要がある場合は、これらの3文字だけを含むタイプNUMBERの別の列を作成し、プレーンな =を使用します。 その上の演算子。

    3. 別のを作成します 列ID_CHAR タイプVARCHAR2 TO_CHAR(id)で入力します 。インデックスを付けて、IDの代わりに使用します WHERE 状態。

      もちろん、既存のID列に基づいて追加の列を作成する場合は、これら2つの同期を維持する必要があります。これは、単一のUPDATEとして、またはON-UPDATEトリガーでバッチで行うか、その列を適切なものに追加できます。コード内のINSERTステートメントとUPDATEステートメント。



    1. 列の値が存在しない場合は、テーブルに参加しないでください

    2. Laravel:ビューでクエリをページングするMySQLエラー1140GROUP列の混合

    3. 変更時にサブカテゴリ選択ボックスを作成する

    4. Doctrine2-ワンショットで複数の挿入