それは私を夢中にさせています。Navicatを介して直接クエリを実行する場合と比較して、Hibernateの単純な選択を行うのは非常に時間がかかります。もっと興味深いものは何ですか。ローカルデータベースでこのクエリを実行するのは非常に高速ですが、リモートで使用するのは非常に貧弱です。
私は次のHibernateネイティブSQLクエリを実行しています(HQLまたはCriteriaは左結合をサポートしていないため):
List list = new ArrayList();
String queryStr = "select s.* from sales_unit s left join sales_unit_relation r on (s.sales_unit_id = r.sales_unit_child_id) where r.sales_unit_child_id is null";
Query query = session.createSQLQuery( queryStr ).addEntity( SalesUnit.class );
Long start = System.currentTimeMillis();
list.addAll( query.list() );
Long stop = System.currentTimeMillis();
System.out.println( "Time: " + (stop - start) + "ms." );
エンティティの構造は実際には重要ではありません。SALES_UNITテーブルとSALES_UNIT_RELATIONテーブルの両方に約28kのレコードがあります
ローカルデータベースを使用してローカルJBossで実行した結果は、約30〜120ミリ秒です。リモートデータベース、ローカルJBoss(同じデータ)で実行している場合、時間は30000〜40000ミリ秒になります。Navicatでこのクエリを実行しているとき、ローカル呼び出しとリモート呼び出しの両方が非常に高速です(20〜30ミリ秒)。
ローカルデータベースとリモートデータベースの両方が同じ方法でインストールされました->OracleEnterpriseEdition11.2.0.1.0。
このようなパフォーマンスの低下の問題は何でしょうか?どうすればデバッグできますか?
これを読んでください:単純な休止状態のクエリは非常にゆっくりと返されますが、コンストラクターを設定しても何も変更されませんでした
編集。
SALES_UNITテーブルには、名前などの販売単位ノードに関する基本情報が含まれています。唯一の関連付けは、ManyToOneとしてのテーブルSALES_UNIT_TYPEです。主キーはIDであり、日付であるフィールドVALID_FROM_DTTMです。
SALES_UNIT_RELATIONには、販売単位ノード間のリレーションPARENT-CHILDが含まれています。SALES_UNIT_PARENT_ID、SALES_UNIT_CHILD_ID、およびVALID_TO_DTTM/VALID_FROM_DTTMで構成されます。テーブルとの関連付けはありません。ここでのPKは、.. PARENT_ID、.. CHILD_ID、およびVALID_FROM_DTTMです。