1

私は非常に奇妙な行動を整理しようとしています。

私は一緒に働いています:

  • JBoss AS 7.1.1
  • EJB 3.0
  • JPA
  • XA DataSource
  • Oracle 11g

システム機能の 1 つで、ユーザーはそれぞれのステータスを確認できますStore。それぞれに対してStoreクエリを実行し、処理されたすべてのファイルを合計します。クエリは次のようなものです。

 SELECT 
    SUM(CASE file.type
            WHEN 'TYPE_1' THEN 1 
            ELSE 0 
        END) 
    , 
    SUM(CASE file.type
            WHEN 'TYPE_2' THEN 1 
            ELSE 0 
        END) 
    , 
    SUM(CASE file.type
            WHEN 'TYPE_3' THEN 1 
            ELSE 0 
        END) 
 FROM 
    File file
 WHERE 
    file.type IN ('TYPE_1', 'TYPE_2', 'TYPE_3') 
    AND file.status = 'RECEIVED' 
    AND file.store.id = :storeId

問題は、ユーザーがチェックしたい店舗を選択できることです。

最初のストアを確認すると、結果は非常に高速ですが、後続のすべてのクエリにはかなりの時間がかかります。例を挙げましょう:

  1. ユーザー チェック ストア 15 (非常に高速な結果) - 約 200 ミリ秒
  2. ユーザー チェック ストア 2 (非常に遅い結果) - 約 8000 ミリ秒

この部分に注意してください、それは非常に重要です。

  1. ユーザーがログアウトし、再度ログインします。
  2. ユーザーがストア 2 (8000 ミリ秒かかったストア 2) をチェックすると、結果は非常に高速です。

これは非常に奇妙です。以前は時間がかかった同じストアが、現在はかなり高速にロードされています。結果に対してクエリを実行するたびにSQLDeveloper、結果もかなり速くなります。

EJBwithに注釈を付け@TransactionAttribute(TransactionAttributeType.NOT_SUPPORTED)ましたが、実行時間に違いはありませんでした。

を使用してクエリを実行するためのスタンドアロン プロジェクトを作成しましたがJDBC、結果は再び高速になりましDataSourcepersistence.xml

なぜこれが起こるのか誰にも手がかりがありますか?

4

2 に答える 2

1

いくつかのこと:

  1. ユーザーが 2 回目に store2 をチェックすると、Oracle オプティマイザーはおそらくその「キャッシュ」を使用しているため、非常に高速です。
  2. store2 にはどのくらいのファイル レコードがありますか? 文ごとにグループ化を実行して、このファイル テーブルに特別な統計が必要かどうかを確認してください。たとえば、store2 に他のストアよりも劇的に多くのファイル レコードがある場合は、次の方法を実行してみてください。

begin dbms_stats.gather_table_stats(user,'file' , estimate_percent=>100); end; これにより、テーブルの統計が正確になります。

  1. クエリを最適化できます。「合計」を 3 回実行する必要はありません。次のようなことができます。

    select f.type , count(*) from File f where f.store.id = :storeId and f.type IN ('TYPE_1', 'TYPE_2', 'TYPE_3') group by f.type

于 2013-07-02T05:46:29.760 に答える
1

カーディナリティ フィードバックの問題が発生する可能性があります。このブログを見てください。

http://orcasoracle.squarespace.com/oracle-rdbms/2012/12/18/when-a-query-runs-slower-on-second-execution-a-possible-side.html

/KR

于 2013-07-03T13:47:55.830 に答える