oracle資料庫加索引
㈠ oracle資料庫如何重建索引
當索引的碎片過多時,會影響執行查詢的速度,從而影響到我們的工作效率。這時候採取的最有利的措施莫過於重建索引了。本文主要介紹了Oracle資料庫中檢查索引碎片並重建索引的過程,接下來我們就開始介紹這一過程。 重建索引的步驟如下: 1. 確認基本信息 登入資料庫,找到專門存放index 的tablespace,並且這個tablespace下所有index的owner都是tax.將index專門存放在一個獨立的tablespace, 與數據表的tablespace分離,是常用的資料庫設計方法。 2. 查找哪些index需要重建 通過anlyze index .... validate structure命令可以分析單個指定的index,並且將單個index 分析的結果存放到 index_stats試圖下。一般判斷的依據是: height >4 pct_used < 50% del_lf_rows / lf_rows +0.001 > 0.03 g ) 3. google上下載了遍歷所有index腳本 發現anlyze index .... validate structure只能填充單個index分析信息,於是google了下,從網上下了個Loop 腳本,遍歷索引空間下所有的索引名字,並且可以把所有index的分析信息存放到自己建立的一個用戶表中。 4. anlyze index 鎖定index 發現下載的腳本不好用,應為anlyze index在分析索引前要爭取獨占鎖,鎖住index,很明顯有些index正在被應用系統的使用,所以運行anlyze失敗。這里吸取的教訓是,盡量晚上做這種事。但是本人比較喜歡准時回家,所以在語句中添加Exception Handler,拋出anlyze index執行失敗的那些index 名稱,使腳本正常運行完畢。並且根據列印到前台的index name手動執行那些index分析。 5. 總結 雖然發現522個index中有160個符合上面的判斷的依據。但是發現索引都不大,而那些擁有百萬leaf的索引又沒有符合上面的判斷條件,所以結論是無需index rebuild online. 沒有啥碎片。 6.什麼時候可以rebuild index呢? rebuild index online,對那些有大量DML操作的大索引是有益的。可以每個月季度做一次針對較大索引的rebuild。
㈡ oracle資料庫什麼情況下創建索引比較好
索引就好象一本字典的目錄。憑借字典的目錄,我們可以非常迅速的找到我們所需要的條目。資料庫也是如此。憑借Oracle資料庫的索引,相關語句可以迅速的定位記錄的位置,而不必去定位整個表。
雖然說,在表中是否創建索引,不會影響到Oracle資料庫的使用,也不會影響資料庫語句的使用。這就好像即使字典沒有目錄的話,用戶仍然可以使用它一 樣。可是,若字典沒有目錄,那麼可想而知,用戶要查某個條目的話,其不得不翻遍整本字典。資料庫也是如此。若沒有建立相關索引的話,則資料庫在查詢記錄的 時候,不得不去查詢整個表。當表中的記錄比較多的時候,其查詢效率就會很低。所以,合適的索引,是提高資料庫運行效率的一個很好的工具。
不過,並不是說表上的索引越多越好。過之而不及。故在資料庫設計過程中,還是需要為表選擇一些合適的索引。寧缺勿濫,這是建立索引時的一個遵循標准。在 理論上,雖然一個表可以設置無限的索引。但是,資料庫管理員需要知道,表中的索引越多,維護索引所需要的開銷也就越大。每當數據表中記錄有增加、刪除、更 新變化的時候,資料庫系統都需要對所有索引進行更新。故資料庫表中的索引絕對不是多多益善。具體來說,在索引建立上,筆者對大家有如下建議。
建議一:在基數小的欄位上要善於使用點陣圖索引。
create bitmap index index_name on table_name (column_name);
基數是點陣圖索引中的一個基本的定義,它是指資料庫表中某個欄位內容中不重復的數值。如在員工信息表中的性別欄位,一般就只有男跟女兩個值,所以,其基數為2;婚姻狀況欄位的話,則其只有已婚、未婚、離婚三種狀態,其基數就為3;民族一覽內也是只有有限的幾個值。
對於要查詢基數小的欄位,如現在用戶想查找所有婚姻狀況為已婚的女性時,利用點陣圖索引可以提高查詢的效率。這主要是因為標准索引是通過在索引中保存排序過的索引列以及對應的ROWID來實現的。若我們在基數小的列上建立標准索引的話,則其會返回大量的記錄。
而當我們在創建點陣圖索引的時候,在Oracle會對整個表進行掃描,並且會為索引列的每個取值建立一個點陣圖。若內容相同,則在點陣圖上會以一個相同的數字 表示。此時,若這個欄位的基數比較小的話,則若需要實現對整個欄位的查詢的話,效率就會非常的高。因為此時,資料庫只要點陣圖中數字相同的內容找出來即可。
除了在數據表某列基數比較小的情況下,採用點陣圖索引外,我們往往在一些特殊的情況下,也會建議採用點陣圖索引。最常見的情況是,在Where限制條件中, 若我們多次採用AND或者OR條件時,也建議採用點陣圖索引。因為當一個查詢飲用了一些部署了點陣圖索引的列的時候,這些點陣圖可以很方便的與AND或者Or 運算符操作結合以快速的找出用戶所需要的記錄。
但是,這里要注意,不是在條件語句中包含運算符的時候,採用點陣圖索引都能夠提供比較高的 效率。一般來說,只有AND 或者OR運算符的時候,點陣圖索引才會比較具有優勢。若此時用戶採用大於號或者不等於號作為條件語句中的限制條件的時候,則往往採用標准索引具有更大的優 勢。
所以,筆者在資料庫設置中,一般只有在三種情況下才採用點陣圖索引。一是列的基數比較小,而有可能需要根據這些欄位的內容查找相關的 記錄;二是在條件語句中,用到了AND或者OR運算符的時候。除了這兩種情況外,最好能夠採用其他適合的索引。第三種情況是,需要用到NULL作為查詢的 限制條件。因為標准查詢一般情況下,會忽略所有的NULL值列。也就是說,若需要查詢所有沒有身份證號碼的員工的信息的時候,標准索引並不能夠起到加 速查詢速度的作用。此時,就需要採用點陣圖索引。因為點陣圖索引會記錄相關的NULL值列信息。
建議二:創建索引的一些限制條件。
並不說,表或者列建立的索引越多越好。相反,索引建的越多,有時會反而會影響資料庫運行的整體性能。所以,在建立索引的時候,仍然會有一些限制條件。
一是不要對一些記錄內容比較少的表建立索引。在一個應用系統設計的時候,如設計一個ERP系統的資料庫,其雖然有幾千張表。但是,並不是每張表都有大量 記錄的。相反,其中有近一半左右的數據表,可能其存儲的數據不會超過百條。如員工登陸帳戶密碼表、企業部門信息表等等。對於這些記錄內容比較少的表,我們 建立最好不要為其建立索引。無論是表上的,還是欄位上,都不要建立索引。
二是若表中的內容比較大,但是,這個表基本上不怎麼查詢的時 候,則只需要在表上建立索引即可;而不需要在欄位上建立索引。如現在在ERP系統中,有一張表是AD_Table。其存儲的是這個資料庫中相關表的信 息。這張表只有在資料庫設計的時候才會用到。故這張表中的記錄雖然比較多,但是由於用戶用的比較少,所以,一般沒有必要為這張表建立列級別上的索引。而直 接用表索引來代替。
三是在一些NULL欄位上,要根據實際情況來判斷是否要建立索引。如現在有一張人事檔案的表格,其上面有兩個欄位, 分別為身份證號碼與地區。有時會為了某個原因,企業需要所有員工都在系統中登記他們的身份證號碼,以方便他們辦工資卡、社會保險等等。所以人事管 理可能需要經常的查詢系統,看看有沒有沒有身份證號碼的員工信息。此時,就需要利用條件IS NULL來查詢我們所需要的記錄。故為了提高查詢效率,若某個記錄可能為空,並且經常需要以NULL為條件進行查詢的時候,則最好給這個欄位添加一個索 引,並且最好建立點陣圖索引。相反,若雖然可能會以NULL這個條件作為查詢的限制語句,但是,用的不是很多的時候,則就沒有必要為其建立索引。
建議三:多表連接查詢的索引設計。
如現在有一個人事管理系統。人事經理想知道員工的社保繳納情況。他需要知道員工的姓名、職務、戶籍性質(農民戶口跟居民戶口費用不一樣)、繳納的情況等 等。但是,這些信息包含在不同的表中。因為為了提高資料庫的性能,在表中存儲的可能只是某些序號,而不是具體的內容。如在社保表中,存儲的是員工對應的編 號,而不是員工的名字。所以,要得到這份報表的話,就可能需要關聯員工基本信息表、公司組織結構表等表格,才能夠查詢到用戶所需要的內容。
為此,就需要利用Join語句,把這些表格關聯起來。為了提高資料庫的查詢效率,這些用來關聯的欄位,最好能夠建立索引。這可以顯著的提高查詢的速度。
建議四:在表的更新速度與查詢速度之間尋求一個平衡點。
眾所周知,索引本身並不影響資料庫的使用,其主要是為了提高資料庫的查詢效率。但是,由於當資料庫的表中的數據更新的時候,包括記錄的增加、刪除、更改等等,都會對雖有的索引進行更新。
很明顯,索引雖然可以提高查詢速度。但是,也會對一些表的更新操作產生不良的影響。當在表中建立的索引越多,這個不利影響也會越大。故資料庫管理員在設置索引的時候,還需要注意,在這兩個之間需要一個均衡點。
按照一般的理論來說,當某個表多數用來查詢、更新相對來說比較上的話,則要多多採用索引。相反,當某個表記錄更新居主導,查詢相對來說比較少的話,則不要建立太多的索引,避免對更新的速度差生不利影響。
在實際工作中,若某個表頻繁的被視圖所調用的話,則最好就好設置比較多的索引了。
㈢ oracle怎樣添加索引
create index 索引名 on tbl_name (A1,B1).
創建索引的目的是為了在某些欄位上查詢更快,而添加的一些預地址。
㈣ oracle資料庫索引種類,分別什麼情況下使用
1. b-tree索引
Oracle資料庫中最常見的索引類型是b-tree索引,也就是B-樹索引,以其同名的計算科學結構命名。CREATE
INDEX語句時,默認就是在創建b-tree索引。沒有特別規定可用於任何情況。
2. 點陣圖索引(bitmap index)
點陣圖索引特定於該列只有幾個枚舉值的情況,比如性別欄位,標示欄位比如只有0和1的情況。
3. 基於函數的索引
比如經常對某個欄位做查詢的時候是帶函數操作的,那麼此時建一個函數索引就有價值了。
4. 分區索引和全局索引
這2個是用於分區表的時候。前者是分區內索引,後者是全表索引
5. 反向索引(REVERSE)
這個索引不常見,但是特定情況特別有效,比如一個varchar(5)位欄位(員工編號)含值
(10001,10002,10033,10005,10016..)
這種情況默認索引分布過於密集,不能利用好伺服器的並行
但是反向之後10001,20001,33001,50001,61001就有了一個很好的分布,能高效的利用好並行運算。
6.HASH索引
HASH索引可能是訪問資料庫中數據的最快方法,但它也有自身的缺點。集群鍵上不同值的數目必須在創建HASH集群之前就要知道。需要在創建HASH集群的時候指定這個值。使用HASH索引必須要使用HASH集群。
㈤ oracle資料庫里怎麼建索引
create index 索引3名稱 on 表 ( 欄位 ); ncdЪa九洎v礎νt螗oy▽g┮dЪ
㈥ oracle中視圖可以創建索引嗎
oracle中視圖可以創建索引,創建索引方法為:
1、打開Navicat。
㈦ oracle資料庫建立復合唯一索引
這就簡單了年份更不可能重復,建立唯一索引 create unique index(年份,屆數,次數) 即可
㈧ oracle資料庫幾萬條數據索引效果明顯嗎
效果比較明顯,有一定的實用性。
隨著數據量增加,索引樹的高度也會增加,oracle的建議是索引樹高度超過4需要重建索引,但如果因為數據量的累加而導致高度增加,重建不起作用,本人唯一了解到的辦法只有物理分表,單表數據量的控制可以有效避免索引的性能惡化。
㈨ 可不可以在Oracle表中有大量數據時創建索引,這樣做有沒有不好的影響
oracle中視圖可以創建索引,沒有不好的影響,創建索引方法。
如下參考:
1.打開Navicat,如下圖所示。
㈩ oracle資料庫添加索引怎麼使用
索引建立代碼:
sql">CREATEINDEX命令語法:
CREATEINDEX
CREATE[unique]INDEX[user.]index
ON[user.]table(column[ASC|DESC][,column
[ASC|DESC]]...)
[CLUSTER[scheam.]cluster]
[INITRANSn]
[MAXTRANSn]
[PCTFREEn]
[STORAGEstorage]
[TABLESPACEtablespace]
[NOSORT]
Advanced
其中:
schemaORACLE模式,預設即為當前帳戶
index索引名
table創建索引的基表名
column基表中的列名,一個索引最多有16列,long列、longraw
列不能建索引列
DESC、ASC預設為ASC即升序排序
CLUSTER指定一個聚簇(Hashcluster不能建索引)
INITRANS、MAXTRANS指定初始和最大事務入口數
Tablespace表空間名
STORAGE存儲參數,同createtable中的storage.
PCTFREE索引數據塊空閑空間的百分比(不能指定pctused)
NOSORT不(能)排序(存儲時就已按升序,所以指出不再排序)