2017-08-19 18 views
1

このようなクエリがあります。大規模なデータセットでoracle sqlのパフォーマンス

私はJpaを使用し、最初の50件の結果のみを取得しますが、200万レコードのテーブルでは時間がかかりすぎます。

パフォーマンスを向上させるにはどうすればよいですか?

SELECT * FROM TRANSACTION 
WHERE 
    (trunc(REQUEST_TIME,'MI') between to_date('1390/01/01 01:01','YYYY/MM/DD HH24:MI','nls_calendar=persian') 
           and to_date('1396/11/01 01:01','YYYY/MM/DD HH24:MI','nls_calendar=persian')) 
and CUSTOMER like '%123%' 
and (case when (ERROR_CODE is not null and ERROR_CODE <> 200) then -1 
      when (ERROR_CODE is not null and ERROR_CODE =200) then 200 
     else 0 end =0) 
and (URL = 'url1') 
and (SOURCE like '%123%') 
and (ERROR_CODE=200) 
and (REQUEST_ID like '%1234%') 
+0

あなたの条件は「ERROR_CODE」に矛盾しています。 'CASE'式は特に、' ERROR_CODE'が 'NULL'でなければ一致しません。しかしそれは後の条件で除外されます。 –

+0

テーブルにはどのようなインデックスがありますか? –

答えて

0

それはneedelessですが(いずれかが存在する場合)の列REQUEST_TIMEにインデックスを使用してからRDBMSを防止し、ここからTRUNC機能を削除します。

(trunc(REQUEST_TIME,'MI') between ....... 

場合、ここからERROR_CODE is not null条件を削除しますERROR_CODE <> 200またはERROR_CODE =200の場合は、常にNULLでなくてはなりません。

あなたが上記の条件を簡素化する場合は、取得します:

case when ERROR_CODE <> 200 then -1 
    when ERROR_CODE =200 then 200 
    else 0 
end =0 

あなたは上記の簡素化状態を調べると、それは「他の0」の部分のみチェックしていますことは明らかですので、それをさらに簡素化することができますちょうどに:あなたのクエリand (ERROR_CODE=200)内の別の条件があるので

ERROR_CODE IS NULL 

しかし、最初の条件は、別の1 and (ERROR_CODE=200)を除いたので、私はあなたが私たちの問題の本当のクエリを示していないと思います。私は単にロジックエラーの可能性が高いため、この条件を削除するだけです。上記の単純化した後


あなたが得られます。

SELECT * FROM TRANSACTION 
WHERE 
    REQUEST_TIME between to_date('1390/01/01 01:01','YYYY/MM/DD HH24:MI','nls_calendar=persian') 
        and to_date('1396/11/01 01:01','YYYY/MM/DD HH24:MI','nls_calendar=persian') 
    and CUSTOMER like '%123%' 
    and (URL = 'url1') 
    and (SOURCE like '%123%') 
    and (ERROR_CODE=200) and(REQUEST_ID like '%1234%') 

REQUEST_TIME上に作成したインデックスがあることを確認して、そうでない場合は、それを作成し、クエリのパフォーマンスを検証します。

0

ただし、これはアドホック(めったに使用されない)型のクエリではありません。
trunc(REQUEST_TIME,'MI')の機能インデックスを列として定義します。

関連する問題