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使用索引生效,會使得查詢幾秒就能查詢出來數據。
所以利用好索引,即使面對百萬、千萬、上億條數據也不用擔心查詢超時。