Skip to Main Content

Japanese

Announcement

For appeals, questions and feedback about Oracle Forums, please email oracle-forums-moderators_us@oracle.com. Technical questions should be asked in the appropriate category. Thank you!

SQLのコストについて

kagemaru2111May 24 2012 — edited Jun 8 2012
初めて投稿いたします。
現在、業務上で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
Comments
Locked Post
New comments cannot be posted to this locked post.
Post Details
Locked on Jul 6 2012
Added on May 24 2012
4 comments
1,112 views