初めて投稿いたします。
現在、業務上でOracle11gを使用しております(経験は9iまで)が、SQLのチューニングについて行き詰っております。
JavaのDao上から以下のSQL文を発行するとオーバーヘッドが発生し、処理が重くなってしまいます。
SELECT
LOGINID,
LOGINID_OLD,
RCPTID,
FULLNAME,
FULLNAME_FURIGANA1,
FULLNAME_FURIGANA2,
EMAIL,
OPEN_DATE8,
D_CRT,
D_DEL,
F_ACCOUNT_DEL,
D_ACCOUNT_DEL
FROM
(
SELECT
LOGINID,
LOGINID_OLD,
RCPTID,
FULLNAME,
FULLNAME_FURIGANA1,
FULLNAME_FURIGANA2,
EMAIL,
OPEN_DATE8,
D_CRT,
D_DEL,
F_ACCOUNT_DEL,
D_ACCOUNT_DEL
FROM
(
SELECT
AUTH.LOGINID,
AUTH.LOGINID_OLD,
RCPT.RCPTID,
RCPT.FULLNAME,
RCPT.FULLNAME_FURIGANA1,
RCPT.FULLNAME_FURIGANA2,
RCPT.EMAIL,
RCPT.OPEN_DATE8,
RCPT.D_CRT,
RCPT.D_DEL,
AUTH.F_ACCOUNT_DEL,
AUTH.D_ACCOUNT_DEL
FROM
TBL_LOGIN_AUTH AUTH,
TBL_RCPT RCPT
WHERE
(
(
AUTH.F_ACCOUNT_DEL = 0
AND
(
(
@P1 IS NOT NULL
AND AUTH.LOGINID = @P1
)
OR
@P1 IS NULL
)
)
OR
(
AUTH.F_ACCOUNT_DEL = 1
AND
(
(
@p2 IS NOT NULL
AND AUTH.LOGINID_OLD = @p2
)
OR
@p2 IS NULL
)
)
)
AND
(
(
@p3 IS NOT NULL
AND RCPT.FULLNAME_FURIGANA1 LIKE @p3
)
OR
@p3 IS NULL
)
AND
(
(
@p4 IS NOT NULL
AND RCPT.FULLNAME_FURIGANA2 LIKE @p4
)
OR
@p4 IS NULL
)
AND AUTH.CIEID = @p5
AND AUTH.CIEID = RCPT.CIEID
AND AUTH.RCPTID = RCPT.RCPTID
)
)
この様なSQL(?はパラメータに置き換えております)なのですが200万件のテーブルを舐めるのに4秒以上かかってしまいます。
SQLDeveloperなどでコストを計算したりしてみたのですが、最少で6、最大で3007(インデックスが使用されない状態)となってしまい、頭を抱えております。
TBL_LOGIN_AUTHのLOGINIDカラムとTBL_RCPT RCPTのFULLNAME_FURIGANA1,FULLNAME_FURIGANA2にはきちんとインデックスが張られています。
素人考えなのですが、パラメータとして渡された値がNULLかどうかを調べる辺りが怪しいと思っております。チューニングの経験が少ないため、何かと分からない事が多くて困っております。
何か良い方法がございましたらご教示願います。
Edited by: kagemaru2111 on 2012/05/23 23:19
Edited by: kagemaru2111 on 2012/05/23 23:30
Edited by: kagemaru2111 on 2012/05/24 21:17
Edited by: kagemaru2111 on 2012/05/24 21:18
Edited by: kagemaru2111 on 2012/05/24 21:25
Edited by: kagemaru2111 on 2012/05/24 21:30