Oracle之表分区、分区索引(一)
生活随笔
收集整理的這篇文章主要介紹了
Oracle之表分区、分区索引(一)
小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
繼續(xù)往下講就是分區(qū)了
對(duì)于ORACLE來(lái)講,分區(qū)是咱們開(kāi)發(fā)中最常用的,什么樣的場(chǎng)景下要進(jìn)行分區(qū),主要是針對(duì)于大數(shù)據(jù)量的表,頻繁查詢(xún)的表,我只是說(shuō)數(shù)據(jù)量大的表,并沒(méi)有說(shuō)物理的這個(gè)大,比如你搞一個(gè)文件表,數(shù)據(jù)庫(kù)文件,里面來(lái)一個(gè)file文件,你搞一個(gè)file文件這種表,然后你去做分區(qū),那樣的話其實(shí)也不是很快的,我們這里說(shuō)的怎么去做分區(qū),是按照數(shù)據(jù)量來(lái)的,不是按照物理的大小來(lái)的,按照物理大小其實(shí)ORACLE應(yīng)付不了太大的數(shù)據(jù),資深的ORACLE DBA,做運(yùn)維這方向,一個(gè)表得有多大嗎,多少個(gè)G嗎,你想不到,你們猜一猜,一張表,當(dāng)然是存放file文件的表,存放一些圖片,還有一些其他的東西,你們猜一下這張表有多大,300G,就是一張表300G,你猜猜這張表有多少東西,就是一張300G的file表,就是那個(gè)文件表,就是怎么說(shuō)呢,累積好多年的一些圖片數(shù)據(jù),我問(wèn)他怎么辦,沒(méi)什么解決的辦法,就是光備份就得備份好幾天,因?yàn)槭裁窗?大數(shù)據(jù)你可以存在其他的地方,你這么大的數(shù)據(jù)量,當(dāng)然DBA不是JAVA這個(gè)方向,就是再索引你這個(gè)也太大了,就是300G,你想想,300G是什么概念,一張表300個(gè)G,像有些需求啊,咱們?nèi)プ鲰?xiàng)目的時(shí)候,也會(huì)有張文件表,數(shù)據(jù)庫(kù)里面必須有張文件表,文件表應(yīng)該存一些比較特殊的文件信息,你像一些無(wú)關(guān)緊要的信息,卻還是很海量的信息,我們一般是放在類(lèi)似于數(shù)據(jù)倉(cāng)庫(kù),和文件服務(wù)器上,咱們?cè)跀?shù)據(jù)庫(kù)里面給一個(gè)字段,給一個(gè)文件服務(wù)器的路徑,給他寫(xiě)到里邊,然后瀏覽器直接訪問(wèn)這條記錄的時(shí)候,有一個(gè)path路徑,直接到界面上能夠顯示出來(lái),都是這么去做的,當(dāng)然也是好多年了,也沒(méi)人去管,好了不用討論這個(gè)事了,首先咱們說(shuō)分區(qū)的事,ORACLE表分區(qū)最好一個(gè)區(qū)間不要大于500W條,500W條應(yīng)該是一個(gè)工作限,你按什么分區(qū),一個(gè)區(qū)間500W條數(shù)據(jù),這個(gè)東西你要自己去衡量,自己去判斷的,首先分區(qū),怎么去做分區(qū),使用什么分區(qū),還是用實(shí)際的業(yè)務(wù)邏輯去考慮的,ORACLE 11g提供了7種的分區(qū)功能,非常強(qiáng)大,滿足90%以上的需求,一般來(lái)講咱們隊(duì)分區(qū)應(yīng)該是非常的有了解了,應(yīng)該是這樣的,ORACLE里面一共分這些種,咱們一起來(lái)看一下,range分區(qū),hash,list,復(fù)合,間隔,system,這7種分區(qū),首先說(shuō)第一種分區(qū)
咱們的range分區(qū),range分區(qū)其實(shí)就是區(qū)域分區(qū),就是你從邏輯上給我劃分一個(gè)區(qū)域,然后按照這個(gè)區(qū)域把這個(gè)表進(jìn)行一個(gè)分區(qū),原先的一個(gè)數(shù)據(jù)庫(kù)表存在一個(gè)文件里,就是咱們對(duì)應(yīng)的數(shù)據(jù)庫(kù)文件里,那現(xiàn)在我做分區(qū)了以后,就是把多個(gè)表拆分成了多個(gè)塊,就是有多個(gè)數(shù)據(jù)庫(kù)文件,那么大家想一件事,你說(shuō)這樣去做分區(qū)的話,畫(huà)個(gè)圖,就是我分區(qū)的概念是什么啊,我在這里簡(jiǎn)單的說(shuō)一下,無(wú)論你怎么樣的分區(qū),其實(shí)都是一樣的,都是一個(gè)概念,就是原先咱們一張表不做分區(qū)的時(shí)候,咱們的一個(gè)表是存在數(shù)據(jù)庫(kù)一個(gè)文件上的,就是咱們磁盤(pán)上有一個(gè)小文件,專(zhuān)門(mén)就對(duì)應(yīng)這張表去存,這個(gè)文件就存這個(gè)表的信息,然后我分區(qū)了以后,就相當(dāng)于什么,相當(dāng)于不存在一個(gè)地方了,把第一個(gè)區(qū)間,第二個(gè)區(qū)間,第三個(gè)區(qū)間,分別的放在不同的物理的位置,可能有3個(gè)文件,那么現(xiàn)在問(wèn)題就產(chǎn)生了,咱們的語(yǔ)法必須得結(jié)合create table去實(shí)現(xiàn),就是說(shuō)什么啊,你在創(chuàng)建表的時(shí)候,然后緊連著指定partition,你不能先創(chuàng)建表,表創(chuàng)建完了以后你再去指定partition,這是不行的,你只能是創(chuàng)建表的時(shí)候一并去指定partition,去指定分區(qū),只有這樣才行,因?yàn)槟阋坏┍韯?chuàng)建完了之后,一個(gè)數(shù)據(jù)文件已經(jīng)創(chuàng)建完了,就是我這個(gè)表所有的數(shù)據(jù)都放在這個(gè)文件里了,所以你再分區(qū),這個(gè)表去拆成幾個(gè)文件,這個(gè)不現(xiàn)實(shí),一些運(yùn)維的手段,運(yùn)維什么手段呢,利用一些抽取工具一部分一部分的逐漸的去建立,所以說(shuō)這些都不是咱們要考慮的事了,就是現(xiàn)在要告訴你的事情是create table的時(shí)候,直接指定加上partition,這樣的話才能一個(gè)表按照你的物理的文件去存儲(chǔ),所以說(shuō)為什么語(yǔ)法是這樣的呢,就是因?yàn)檫@個(gè)原因,以表單位還是以庫(kù)為單位,這個(gè)你自己可以去定義,這個(gè)就無(wú)所謂了咱們先看一個(gè)小例子吧,首先我就create一個(gè)table,然后指定一個(gè)分區(qū),就可以這樣去做,你把咱們來(lái)寫(xiě)一寫(xiě)吧,現(xiàn)在我就來(lái)寫(xiě)一個(gè)分區(qū)的小例子,我這個(gè)分區(qū)也是有小例子的,所以我就不怎么想去寫(xiě)他了,創(chuàng)建一個(gè)SQL Window,看這個(gè)例子吧,首先我是做什么事呢
range分區(qū),是按照區(qū)域進(jìn)行分區(qū),分區(qū)一定是在create table的時(shí)候進(jìn)行指定的,這是要記住的一個(gè)問(wèn)題,我們先看看數(shù)據(jù)庫(kù)里面有沒(méi)有相關(guān)的一個(gè)表,也沒(méi)有,因?yàn)閯?chuàng)建一個(gè)table叫做sale,薪資,兩個(gè)字段,一個(gè)叫product_id,一個(gè)叫sale_count,一個(gè)是id,一個(gè)是計(jì)數(shù),然后這個(gè)數(shù)就隨隨便便寫(xiě)了一個(gè),現(xiàn)在這個(gè)表創(chuàng)建完了以后,正常來(lái)講這里要打一個(gè)分號(hào),但是我沒(méi)有這么去做,我直接說(shuō)partition by,指定range分區(qū),然后括號(hào)里面的內(nèi)容是什么意思呢,指定分區(qū)的字段是什么,說(shuō)白了就是指定分區(qū)的字段是什么,就是咱們上節(jié)課講的MYSQL,我可以指定一個(gè)type類(lèi)型,一個(gè)type類(lèi)型做什么事啊,我按照type等于1的,里面可能有10條數(shù)據(jù),10條數(shù)據(jù)可能有5條數(shù)據(jù)等于1,有5條type等于2,然后把type等于1的放到另外一個(gè)數(shù)據(jù)庫(kù)中,或者是另外一個(gè)表中,這里面放這5條,剩下的都等于2了,就是這個(gè)意思,這個(gè)其實(shí)也是一樣的,咱們要指定的分區(qū)是什么,按照這個(gè)sale_count去做一個(gè)分區(qū),然后現(xiàn)在我既然指定是range分區(qū),所以說(shuō)我要指定區(qū)間,partition p1,分區(qū)的名稱(chēng)是你自己去定義的,我指定一個(gè)p1,values less than(1000),這什么意思,也就是小于1000的這個(gè)數(shù)值,給我放到p1這個(gè)區(qū)間,小于等于2000的放到p2這個(gè)區(qū)間,小于等于3000的放到p3這個(gè)區(qū)間,現(xiàn)在咱們?nèi)?chuàng)建一下,創(chuàng)建完了以后咱們?cè)跀?shù)據(jù)庫(kù)里面多了一個(gè)表了,select * from SALE,他和普通的表沒(méi)有任何的區(qū)別
沒(méi)有什么變化,無(wú)非就是一個(gè)SALE,你從這里看不出有什么特點(diǎn),包括你查詢(xún)的時(shí)候也看不出有什么特點(diǎn),那怎么能看出特點(diǎn)呢,咱們應(yīng)該看這個(gè),查看分區(qū)的情況,應(yīng)該看這個(gè),這個(gè)是所有的分區(qū)的情況,select * from user_tab_partitions,不僅僅是這一張表的情況,user_tab_partitions,select這張表,之前也會(huì)建立很多分區(qū),很多IVERTAL分區(qū),其他你不考慮,首先你看這三個(gè),SALE這個(gè)table,已經(jīng)指定了三個(gè)分區(qū),PATITION_NAME是p1,p2,p3,然后就是HIGH_VALUE,就是他的上限,這個(gè)上限是1000,這個(gè)上限是2000,下面的肯定是3000了,還有些其他的字段,他這個(gè)字段很多,就不詳細(xì)去說(shuō)了
其實(shí)你還可以更詳細(xì)的去看這張表,下面也有,select * from table partition(p1),select * from sale這張表,SELECT * FROM SALE PARTITION(p1),我們可以這樣去查
我可以去查,當(dāng)然我們剛才分了三個(gè)區(qū)間,P1,P2,P3,我可以這么聯(lián)合的去查SELECT * FROM SALE PARTITION(P1);SELECT * FROM SALE PARTITION(P2);SELECT * FROM SALE PARTITION(P3);這三個(gè)區(qū)間的數(shù)據(jù)可能都是空的,現(xiàn)在我就去做一個(gè)插入的操作,INSERT INTO SALE VALUES('1',500);INSERT INTO SALE VALUES('1',1300);INSERT INTO SALE VALUES('1',2441);commit;INSERT INTO SALE VALUES('1',3500); 第一個(gè)字段可能是一個(gè)字符串的值,這里面有一個(gè)number,比如說(shuō)是100,咱們多插入幾個(gè),他這里是1000,第一個(gè)是500吧,第二個(gè)是1300,第三個(gè)是2000到3000之間的區(qū)間,那我2400,隨便給個(gè)值,然后再來(lái)一個(gè)3500,現(xiàn)在先把這三條數(shù)據(jù)插進(jìn)去
然后我SELECT * FROM 表的時(shí)候你還是看不出來(lái)
三條數(shù)據(jù)還是這樣的,你看不出任何的變化,沒(méi)有任何的特點(diǎn),物理分區(qū)會(huì)降低查詢(xún)速度嗎,不會(huì)啊,分區(qū)的目的就是為了提高查詢(xún)的速度,那現(xiàn)在咱們做完這個(gè)事了,然后查詢(xún)出來(lái)也沒(méi)有任何的特點(diǎn),你再去查這三張表
第一個(gè)分區(qū),你看我查P1的時(shí)候,他就一條數(shù)據(jù),然后我查P2的時(shí)候,也就這么一條數(shù)據(jù)
然后我再查P3的時(shí)候,2441
也就是說(shuō)你按照什么分區(qū)字段走,然后你根據(jù)上面的分區(qū)規(guī)則,他就把數(shù)據(jù)塞到不同的分區(qū)里了,大體上就是這個(gè)意思,咱們現(xiàn)在就做著事情INSERT INTO SALE VALUES('1',3500);現(xiàn)在我們的分區(qū)只是三個(gè)區(qū),那我現(xiàn)在想插3500,你覺(jué)得能插進(jìn)去嗎,就是我現(xiàn)在想插一個(gè)3500的數(shù)據(jù),我能不能插入到這個(gè)表里,肯定是找不到位置,插入的關(guān)鍵字未映射到任何的分區(qū),說(shuō)你這個(gè)值已經(jīng)超了我這個(gè)分區(qū)了,那咱們想一下,既然插入不進(jìn)去,一定要再給分區(qū)做一個(gè)擴(kuò)展,肯定是支持?jǐn)U展的,添加和刪除分區(qū)其實(shí)都可以去做,添加就是alter tabletableName add partition p4 values less than(maxvalue),你可以去再指定4000什么的,然后你還可以去指定一個(gè)最終的值,maxvalue,就是無(wú)限大,你如果指定這個(gè)值的話,那就相當(dāng)于給這個(gè)表指定一個(gè)上限了,就是畫(huà)了一個(gè)句號(hào)了,你這塊如果是maxvalue的話,就是max到3000都會(huì)放到這一個(gè)區(qū)間里,你可以正常再來(lái)一個(gè)4000,或者5000,這都是可以的,但是不要輕易去加這個(gè)東西,你這樣你這個(gè)分區(qū)就相當(dāng)于固定了,這表叫SALE
你會(huì)發(fā)現(xiàn)現(xiàn)在就有第四個(gè)了,然后這里面的最大就是MAXVALUE了,那無(wú)論我是插入3500也好,插入一個(gè)8000也好,還是插入1萬(wàn)也好,總會(huì)放到第四個(gè)分區(qū)里,咱們commit一下
我現(xiàn)在繼續(xù)去查一下P4
你會(huì)發(fā)現(xiàn)P4,,3500,8800,都會(huì)放到第四個(gè)區(qū)間里,這就是你對(duì)分區(qū)的一個(gè)擴(kuò)展,然后咱們繼續(xù)往下走,然后你也可以刪除分區(qū),drop,alter table tableName drop partition p4,可以把它干掉,我們?cè)囈幌掳?我把它干掉數(shù)據(jù)會(huì)不會(huì)丟失呢,想一想,咱們直接先操作吧,然后看結(jié)果,刪掉了之后,然后再來(lái)查一下我的partitions
還是三個(gè)區(qū),我SELECT * FROM SALE
你就直接把他這個(gè)數(shù)據(jù)給他弄沒(méi)了
相當(dāng)于把文件給刪除了,再往下看,然后有一個(gè)問(wèn)題就是說(shuō),想做一個(gè)什么事呢,想想啊,我要做這個(gè)事情,我要做update操作,我要做一個(gè)update操作,我這樣去做update,你看我先做表里是這三條數(shù)據(jù),我現(xiàn)在想把這條數(shù)據(jù)改一下,先改一下這個(gè)吧,因?yàn)槲也迦氲臅r(shí)候可能插錯(cuò)了,UPDATE SALE SET product_id = 3 WHERE sale_count = 500,因?yàn)槲覄偛挪恍⌒倪@個(gè)沒(méi)改過(guò)來(lái),咱們?cè)俨橐幌逻@個(gè)表吧,我要1,2,3這個(gè)效果
把第一條記錄,SALE我想改了,我做一個(gè)UPDATE操作,把這個(gè)sale_count改掉,我去UPDATE,UPDATE SALE SET SALE_COUNT = 1500 WHERE PRODUCT_ID = 1;我先去做這個(gè)操作,我更新完之后能更新成功嗎,我現(xiàn)在要更新,更新這條記錄,我想把ID這條記錄,原先是500,準(zhǔn)備改成1500,然后問(wèn)一下能不能更新成功,能不能UPDATE成功,就目前來(lái)講,想一想,能不能進(jìn)行UPDATE成功呢,目前是不能的,我進(jìn)行UPDATE的時(shí)候,更新分區(qū)關(guān)鍵字列將導(dǎo)致分區(qū)的更改,本身我的數(shù)據(jù)原先是在第一個(gè)區(qū)間的,我現(xiàn)在想給他改成第二個(gè)區(qū)間,那這個(gè)肯定不行,當(dāng)然其實(shí)也不是不行,也是可以的,只不過(guò)你得去做一個(gè)操作,在UPDATE之前你得做這個(gè)alter table SALE enable row movement;做一個(gè)這個(gè)操作,就是使他能行移動(dòng),我先做完這個(gè)事情
這個(gè)時(shí)候我再回來(lái)UPDATE就成功了
應(yīng)該使他能移動(dòng),咱們先看第一個(gè)區(qū)間,就沒(méi)數(shù)據(jù)了
但是第二個(gè)區(qū)間里就有兩條數(shù)據(jù)了
ID等于1的數(shù)據(jù)是1500,在這個(gè)里面,可以去做這個(gè)事情,沒(méi)問(wèn)題吧,是不是分區(qū)很簡(jiǎn)單,首先分區(qū)簡(jiǎn)單就這么幾個(gè)操作,這個(gè)能聽(tīng)懂嗎,給我點(diǎn)反饋,很簡(jiǎn)單吧,這個(gè)東西是公共的,比如我把這個(gè)1又改成500,我現(xiàn)在又給他改回去
我們都是在創(chuàng)建完表以后,就是在創(chuàng)建完partition以后,就直接加這么一句話,一般都是這樣的,剛才我已經(jīng)又改了一次了,所以P1里還是會(huì)有數(shù)據(jù)的
咱們繼續(xù)往下看,分區(qū)這塊目前已經(jīng)說(shuō)完了,然后咱們?cè)倏捶謪^(qū)索引
分區(qū)完了以后還得有分區(qū)索引,這是啥意思呢,就是你這個(gè)表分成了幾塊,假如你這個(gè)表,按照什么字段去分區(qū)的,相當(dāng)于你把這個(gè)表分成了幾塊,分成1,2,3,4四塊,現(xiàn)在我要做什么事呢,我要在每一塊上,能不能建一個(gè)索引,分了區(qū)了查詢(xún)會(huì)很慢,首先你想一想,咱們這張表結(jié)構(gòu),我現(xiàn)在就模擬了兩個(gè)字段,我可能有很多的字段,ID當(dāng)然是主鍵了這個(gè)沒(méi)法說(shuō),我現(xiàn)在是按照SALE_COUNT進(jìn)行分區(qū)的,可能SALE_COUNT這個(gè)列,這個(gè)字段,按照這個(gè)列進(jìn)行分區(qū)的,那么劃分成這四個(gè)區(qū)間以后,那我在這四個(gè)區(qū)域里,怎么去建索引呢,這個(gè)就相當(dāng)于分區(qū)索引,分區(qū)以后雖然可以提高查詢(xún)效率,分區(qū)以后為什么提高查詢(xún)效率,其實(shí)它并不是提高了查詢(xún)效率,僅僅是提高了數(shù)據(jù)的范圍,那這個(gè)舉個(gè)列子吧,加入我這個(gè)表里面有8條數(shù)據(jù),剛才我不是按照SALE_COUNT進(jìn)行分區(qū)的嗎,可能把我這個(gè)分成了4個(gè)區(qū)間,分成1,2,3,4這四個(gè)區(qū)間,然后每個(gè)區(qū)間內(nèi)分成兩個(gè)數(shù)據(jù),如果我WHERE條件接的是一個(gè)SALE_COUNT,按照咱們剛才的說(shuō)法,就是1000,然后這邊是1000到2000的,然后這邊是2000到3000的,然后這是maxvalue,那我現(xiàn)在想按照count去查詢(xún),去查等于2300的,那這個(gè)是會(huì)提高查詢(xún)效率的,為什么呢,原先加入我不走索引,不走索引的字段,正常來(lái)講我是全表進(jìn)行掃描,full-scan,都得從頭掃到尾,找到這兒,不是2300嗎,我在第三個(gè)區(qū)間,這個(gè)區(qū)間是2000到3000的區(qū)間,2000到3000區(qū)間的時(shí)候,才找到了這個(gè)數(shù)據(jù),才知道2300,你得經(jīng)歷查完這兩條,然后查完這兩條,才能查到第三個(gè)區(qū)間的這個(gè)數(shù)據(jù),現(xiàn)在你做這個(gè)事情,都屏蔽掉了,P4也屏蔽掉了,直接到第三個(gè)區(qū)間,直接去找這個(gè)值,但是有一個(gè)問(wèn)題是什么呢,你現(xiàn)在還是不是走索引,所以你要是分完區(qū)以后,加完這個(gè)索引,你這個(gè)效率才會(huì)變得很好,分區(qū)僅僅是縮小了查詢(xún)的范圍,咱們建立分區(qū)索引,進(jìn)一步提高查詢(xún)效率,分區(qū)索引大體上分為兩類(lèi),一類(lèi)叫做local,一類(lèi)叫做global,一般我們都會(huì)使用本地的分區(qū),在你建完分區(qū)的文件去建立索引,global就是不考慮分區(qū),咱們還是在整個(gè)表去建立索引,你分不分區(qū)跟咱沒(méi)關(guān)系,我們一般采用本地模式,在每個(gè)分區(qū)上建立索引,說(shuō)白了就是這個(gè)圖,我剛才使用SALE_COUNT進(jìn)行分區(qū)的,我一定只能在SALE_COUNT這個(gè)分區(qū)字段上建立索引,只能在這個(gè)分區(qū)字段上建立索引,這個(gè)就是分區(qū)索引,它會(huì)子啊每一個(gè)LOCAL上建立索引,這塊是一塊區(qū)間,他建立了一個(gè)索引,這塊區(qū)間他也會(huì)建立一個(gè)索引,這塊區(qū)間,他也可會(huì)建立一個(gè)索引,相當(dāng)于什么啊,相當(dāng)于建立了4個(gè)索引,在一個(gè)字段上,但是是不同的區(qū)間,就是你執(zhí)行這個(gè)語(yǔ)句之后,剛才這種方式叫做LOCAL,LOCAL的方式,還有一種方式叫做GLOBAL,GLOBAL的方式什么意思呢,就是不看這個(gè)分區(qū)了,反正我就建一把索引,在整體上去建索引的,要說(shuō)的就是這個(gè)事,LOCAL是在每個(gè)分區(qū)上都建立索引,然后GLOBAL是在全局上去建立索引,這種方式其實(shí)和分不分區(qū)都是相同的,一般不使用,還有一種方式就是自定義數(shù)據(jù)區(qū)間的索引,這種索引可能叫做前綴索引,他不是按照區(qū)域去劃分的,但是他非常有意義,自定義區(qū)域值的時(shí)候必須要定義maxvalue,咱們先不考慮前綴索引了,咱們先說(shuō)用得最多的LOCAL,在每個(gè)區(qū)間上加一個(gè)索引,然后你要注意的一點(diǎn)是什么啊,在分區(qū)字段上建的索引必須是分區(qū)字段上的列才行,也就是說(shuō)咱們拿SALE這張表來(lái)舉列,加入現(xiàn)在PRODUCT_ID沒(méi)有建索引,就好像我這張表一樣,我這張表壓根就沒(méi)有去建這個(gè)INDEX,他也不是主鍵,有沒(méi)有去建INDEX,就是兩個(gè)平凡的字段,現(xiàn)在我想去建立索引,只能在分區(qū)字段上加索引,我只能在SALE_COUNT上加索引,這個(gè)就是開(kāi)始就定死了的,你沒(méi)辦法,你沒(méi)辦法去做其他的事情,這種語(yǔ)法咱們看一下,create index indexName on table(field) local;其實(shí)就是在傳統(tǒng)的字段加一個(gè)local字段,建立索引你會(huì)了,無(wú)非就是后面加一個(gè)local,然后就完事了,其實(shí)分區(qū)索引,你要注意一個(gè)問(wèn)題,第一分區(qū)上建立的索引,一定是分區(qū)字段,create index,這里面你隨便起個(gè)名字吧,我叫idx_count吧,然后你的table是SALE,然后field當(dāng)然是SALE_COUNT,加了一個(gè)local就OKcreate index idx_count on SALE(SALE_COUNT) LOCAL;
你現(xiàn)在已經(jīng)建立了分區(qū)索引了,就是這樣的,這個(gè)分區(qū)索引你現(xiàn)在也可以看到的,你也可以去查索引這張表,你也可以看到,SELECT * FROM USER_IND_PARTITION;
我現(xiàn)在這個(gè)名字叫做ind_count,它會(huì)產(chǎn)生三個(gè),因?yàn)槲椰F(xiàn)在只有三個(gè)分區(qū),P1,P2,P3,我現(xiàn)在寫(xiě)這一條SQL,相當(dāng)于我寫(xiě)這一條SQL語(yǔ)句,給我建立三個(gè)索引,在每個(gè)分區(qū)上建立一個(gè)索引,就是這個(gè)意思,全局的這種自定義索引,也是很有幫助的這是非常有意義的一種方式,這是啥意思呢,咱們之前都是很固化的,一個(gè)劃分,你比如說(shuō),1,2,3,4,這四塊,咱們剛才是按照COUNT,這個(gè)字段進(jìn)行分區(qū)索引,在這里有個(gè)index,在這里有個(gè)index,假如有4個(gè)INDEX,但是這種只是LOCAL模式的分區(qū)索引,其實(shí)還有一種是前綴索引,前綴索引的意義就比較大了,他可以不考慮分區(qū)去建立索引,可以跨分區(qū)的去建立索引,比如說(shuō)我可以去做什么事啊,原先是在在一個(gè)區(qū)間上去建立索引的,如果你有什么特殊的業(yè)務(wù)邏輯要求,咱們舉剛才那個(gè)例子,這個(gè)COUNT等于0到1000的范圍的數(shù)據(jù),咱們會(huì)在第一個(gè)區(qū)間0到1000,第二個(gè)區(qū)間你是1000到2000的范圍,第三個(gè)區(qū)間是2000到3000,咱們就是舉個(gè)例子,比如3000到4000,就是只要你的COUNT是在這個(gè)區(qū)間范圍內(nèi),給你塞到指定的區(qū)間上,就是這個(gè)意思意思,但是現(xiàn)在有一個(gè)前綴索引,他可以不按照1,2,3,4區(qū)間去建索引,你比如說(shuō)我現(xiàn)在就有個(gè)需求,我查詢(xún)比較頻繁的就是0到2300,0到2300的區(qū)間我查詢(xún)很頻繁,其他的我查詢(xún)不頻繁,那我建的這個(gè)索引就可以是這樣的,從這開(kāi)始建,然后囊括了第二個(gè),然后也囊括了第三個(gè),但是囊括了第三個(gè)就是這樣的,然后這邊就給他排除,用紫色的排除,這里的數(shù)據(jù)肯定是0到1000,然后這里的數(shù)據(jù)是1000到2000,然后這塊的數(shù)據(jù)是2000到2300,然后這塊我刨除的是2300到3000,也就是2300到3000這塊我就不建索引了,那么我建的索引就是這塊,就是這個(gè)區(qū)域,我把這個(gè)刨除,摳出去了,那這種方式叫前綴索引,是根據(jù)你自己業(yè)務(wù)去做的,后期如果說(shuō)你有這種業(yè)務(wù),你需要跨分區(qū)的去建索引的話,其實(shí)還是非常有意義的,能理解我說(shuō)的意思嗎,給我點(diǎn)反饋,如果是普通的表,那你沒(méi)辦法,那你建不了,就是這塊嗎,如果是一個(gè)普通的表,以后如果想去建分區(qū)怎么辦,那沒(méi)有任何的辦法,你只有一種辦法,什么辦法啊,你原先這個(gè)表里沒(méi)有建分區(qū),這里邊有好多數(shù)據(jù),你再克隆一張相同的表,先把這個(gè)分區(qū)劃分好,然后把這個(gè)數(shù)據(jù)導(dǎo)到這個(gè)分區(qū)里,你只有這一種辦法,能理解我說(shuō)的意思吧,如果你表已經(jīng)建好了,你就沒(méi)辦法再分區(qū)了,你只能再重新建立一張相同的表,然后咱們提前把分區(qū)建好,把之前的數(shù)據(jù)導(dǎo)入到新表,這才行,然后前綴索引怎么去建呢,create index 名字on table(field) global,global下面寫(xiě)這個(gè),partition by range(field),比較類(lèi)似于咱們的分區(qū)了,在這里面又寫(xiě)一個(gè)partition,寫(xiě)你的值,你注意你必須得加上maxvalule才行,必須要指定maxvalue才行,就是無(wú)論你寫(xiě)多少個(gè),你得有一個(gè)maxvalue,就是你這里面可以有P1,P2,P3,P4,....,但是最終里面一定要有maxvalue,比如我是從0到1800,它是建立一個(gè)索引,然后從1800到2400,建立一個(gè)索引,然后從2400到1萬(wàn)建立一個(gè)索引,但是最終總得有一個(gè)maxvalue才行,這是前綴索引建立的原則,必須得有他,要不然你這個(gè)東西是建立不成功的,還有這種全局索引的方式,create index idxname on table(field) global;這種方式不推薦,無(wú)非就是在普通的索引上,加了一個(gè)global,他和你平常在全表上建一個(gè)索引是一致的,是一樣的,其他字段不可以建索引,其實(shí)能建也是能建,可以去建這個(gè)索引,但是他效率一點(diǎn)也不高,所以我不推薦你去做這種事情,比如你現(xiàn)在硬要去寫(xiě),你現(xiàn)在想要去create index,然后在id上建一個(gè)索引,可以啊,但是他這個(gè)效率一點(diǎn)也都不會(huì)高,那你想想這不就是屬于全局索引嗎,就是一個(gè)global
?
總結(jié)
以上是生活随笔為你收集整理的Oracle之表分区、分区索引(一)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: Oracle之垂直水平分库分表(二)
- 下一篇: Oracle之表分区、分区索引(二)