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

Hibernate + Javaでのパフォーマンスは遅くなりますが、同じネイティブOracleクエリでTOADを使用すると高速になります

    このコードで何が起こっていると思います:

    SQLQuery query = session.createSQLQuery("myNamedNativeQuery");
    query.setParameter(nameParameter1, value1);
    query.setParameter(nameParameter2, value2);
    query.uniqueResult(); 
    

    これは:

    1行目:名前付きパラメーターのいくつかの期待値に基づいてクエリプランが作成されます。

    4行目:クエリはvalue1とvalue2で実行されますが、これらの値は1行目で作成されたクエリプランの「適切な値」ではないため、データベースは実際の値に対して非常に不適切なプランを実行しており、多くの時間。

    理由?

    HibernateSessionImpl.createSQLQuery(...)のソースコードを見る このコード行を見つけました:

    SQLQueryImpl query = new SQLQueryImpl(
                    sql,
                            this,
                            factory.getQueryPlanCache().getSQLParameterMetadata( sql )
            );
    

    getQueryPlanCache()を呼び出しています いくつかのparameterMetaDataを使用します。このメタデータは十分ではないと思います 。



    1. 複数の親によるオラクル接続

    2. PL/SQLを使用してトリガーの挿入/更新操作を中止します

    3. RailsPostgreSQL数値フィールドオーバーフローエラー

    4. IDごとにPHPとMySqlでコメントボックスを作成します