oracle查分區表的一些注意事項


     昨天有個同事找我看了一段SQL,說是很慢,我首先看了看執行計划,發現COST很大,但是同時我也發現分區讀取的有很大的問題。表示這樣的:

     

create table test1
(
   day_id number
)
partition by range(day_id)
(
   partition part_0 values less than(20130228),
   partition part_1 values less than(20130301),
   partition part_2 values less than(20130302),
   partition part_3 values less than(20130303),
   partition part_4 values less than(20130304),
   partition part_5 values less than(20130305),
   partition part_6 values less than(20130306)
)

  表中的數據如下:

      

      查詢是這樣子的:

      

select * from test1 where substr(day_id,1,6) = 201302

  執行計划是這樣的:

      

      可以看出來,一口氣把所有的分區都讀上了,但是按照我的想法,應該是只讀取part_0和part_1這兩個分區。后來我把這個SQL改成了這樣:

      

select * from test1 where day_id between 20130227 and 20130228

  這個時候的執行計划就是這樣的:

      

      這樣就好了,只讀取了需要的分區,這樣子查詢效率也有了很大的提高。生產系統中一天會有3GB的數據,所以如果按照第一個SQL寫,那么就會讀到這個表所有的分區,數據量就非常可觀了,如果只讀取自己需要的一個月的分區,就要小多了,COST也降低了很多。

      我記得以前寫過一個不能用到索引的情況:http://www.cnblogs.com/wingsless/archive/2011/11/19/2255647.html。昨天遇到這個情況以后發現分區也有這樣那樣的限制,還是原來寫的那句話,一定要慎之又慎的寫SQL。http://www.cnblogs.com/wingsless/archive/2013/03/09/2951618.html


免責聲明!

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



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