mybatis的sql語句導致索引失效,使得查詢超時


mybaitis書寫sql需要特別注意where條件中的語句,否則將會導致索引失效,使得查詢總是超時。如下語句會出現導致索引失效的情況:

with test1 as (select count(C_FUNDACCO) val,'a' v from TINF_REQUEST a
            where a.C_FUNDCODE = #{cFundcode} and a.D_DATADATE = #{dDatadate}),
    test2 as (select count(C_FUNDACCO) val,'a' v from TINF_CONFIRM b
            where b.C_FUNDCODE = #{cFundcode} and b.D_DATADATE = #{dDatadate}),
    test3 as (select count(C_FUNDACCO) val,'a' v from TINF_DIVIDENDDETAIL c
            where c.C_FUNDCODE = #{cFundcode} and c.D_DATADATE = #{dDatadate}),
    test4 as (select count(C_FUNDACCO) val,'a' v from TINF_SHAREDETAIL f
            where f.C_FUNDCODE = #{cFundcode} and f.D_DATADATE = #{dDatadate})
    select test1.val requestCount,test2.val confirmCount,test3.val dividendCount,test4.val shareDeatilCount from test1,test2,test3,test4 where test1.v=test2.v and test2.v=test3.v and test3.v=test4.v

原因:直接使用#{dDatadate}導致索引的失效。

sql語句中出現幾種情況會導致索引失效:

1.TO_CHAR(a.D_DATADATE, 'yyyy-mm-dd') <= TO_CHAR(#{dDatadateStart}, 'yyyy-mm-dd'),導致索引失效。

2.trunc(created)>=TO_DATE('2013-12-14', 'YYYY-MM-DD'),導致索引失效。

3.c.D_DATADATE = #{dDatadate},導致索引失效。

將上述語句加上TO_DATE函數,改為如下語句,不會導致索引失效:

with test1 as (select count(C_FUNDACCO) val,'a' v from TINF_REQUEST a
            where a.C_FUNDCODE = #{cFundcode} and a.D_DATADATE = TO_DATE(#{dDatadate},'yyyy-MM-dd')),
    test2 as (select count(C_FUNDACCO) val,'a' v from TINF_CONFIRM b
            where b.C_FUNDCODE = #{cFundcode} and b.D_DATADATE = TO_DATE(#{dDatadate},'yyyy-MM-dd')),
    test3 as (select count(C_FUNDACCO) val,'a' v from TINF_DIVIDENDDETAIL c
            where c.C_FUNDCODE = #{cFundcode} and c.D_DATADATE = TO_DATE(#{dDatadate},'yyyy-MM-dd')),
    test4 as (select count(C_FUNDACCO) val,'a' v from TINF_SHAREDETAIL f
            where f.C_FUNDCODE = #{cFundcode} and f.D_DATADATE = TO_DATE(#{dDatadate},'yyyy-MM-dd'))
    select test1.val requestCount,test2.val confirmCount,test3.val dividendCount,test4.val shareDeatilCount from test1,test2,test3,test4 where test1.v=test2.v and test2.v=test3.v and test3.v=test4.v

百萬、千萬級別的數據,加上索引並且使索引生效的sql語句,查詢性能會很快。如果sql使得索引失效,將會總是超時,無法加載出來數據。

因此書寫sql一定要注意自己寫的sql是否使得索引生效,查看執行計划

FULL全表掃描即未使用索引(或索引失效);INDEX使用索引查詢,會使得查詢效率非常高。

總結:百萬、千萬級別的數據,在查詢sql上使用索引查詢,會很大的提高性能。

           原來表中不加索引的查詢需要5分鍾甚至更長時間導致查詢超時;加上索引后並且sql使用索引生效,會使得查詢幾秒就能查詢出來數據。

   所以利用好索引,即使面對百萬、千萬、上億條數據也不用擔心查詢超時。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM