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

HibernateCriteraAPIとOracleを使用した動的クエリ-パフォーマンス

    ここにはいくつかのことがあります。まず第一に、INリストをバインドすることはできません。少なくとも、バインドできないと確信しています。 Hibernateは、配列の内容をOracleが使用できる静的なリストに入れる何らかのトリックを使用していると思われます。

    次に、このクエリを多くの異なるパラメータで実行する場合は、変数をバインドする必要があります。そうしないと、データベース全体のパフォーマンスが低下します。

    とはいえ、TomKyteがブログで説明している「トリック」を使用してINリストをバインドする方法があります-

    http://tkyte.blogspot.com/2006/01/how -can-i.html

    そこにあるコードは次のようになります:

    [email protected]> with bound_inlist
    2  as
    3  (
    4  select
    5    substr(txt,
    6           instr (txt, ',', 1, level  ) + 1,
    7           instr (txt, ',', 1, level+1) - instr (txt, ',', 1, level) -1 )
    8           as token
    9    from (select ','||:txt||',' txt from dual)
    10  connect by level <= length(:txt)-length(replace(:txt,',',''))+1
    11  )
    12  select *
    13    from all_users
    14   where user_id in (select * from bound_inlist);
    
    USERNAME                          USER_ID CREATED
    ------------------------------ ---------- ---------
    SYSTEM                                  5 30-JUN-05
    OPS$TKYTE                             104 20-JAN-06
    

    パーツ:

    12  select *
    13    from all_users
    14   where user_id in (select * from bound_inlist);
    

    基本的にあなたのクエリが行くところです。上記のビットは、コンマ区切りの文字列を値のリストに分割するトリックです。リストを:txtプレースホルダーにバインドする代わりに、リストを文字列に変換してバインドする必要があります。

    クエリ時間の違いは、マシンのキャッシュや負荷の変動によるものではありませんか?クエリの解析には少し時間がかかりますが、数秒は長い時間です。



    1. MariaDBでのUTC_DATE()のしくみ

    2. SQLclを使用するときにクエリからINSERTステートメントを生成する方法(Oracle)

    3. mysqlclientをインストールできません

    4. OracleのIDLEタイムアウトパラメータ