Oracle之SQL優化 索引的基本原理(二)

2021-09-30 13:45:59 字數 3657 閱讀 7107

1、為什麼使用索引?

(1)、原因

索引中只有一列,io小,所以較快;

索引中此列是排序的,二叉查詢,提高查詢速度。

(2)、原因分析

索引是對資料庫表中一列或多列的值進行排序的一種結構。

索引的作用相當於圖書的目錄,可以根據目錄中的頁碼快速找到所需的內容。

當表中有大量記錄時,若要對錶進行查詢有2中搜尋方式:

第一種搜尋資訊方式是全表搜尋,是將所有記錄一一取出,和查詢條件進行一一對比,然後返回滿足條件的記錄,

這樣做會消耗大量資料庫系統時間,並造成大量磁碟i/o操作;

第二種就是在表中建立索引,然後在索引中找到符合查詢條件的索引值,最後通過儲存在索引中的rowid(相當於頁碼)

快速找到表中對應的記錄。

注:當對表中的資料進行增加、刪除和修改的時候,索引也要動態的維護,降低了資料的維護速度。

2、什麼情況下適合建立索引:

(1)表的主鍵、外來鍵必須有索引。

(2)經常與其它表進行連線的表,在連線欄位上應該建立索引。

(3)經常出現在where子句中的字段,特別是大表的字段,應該建立索引。

(4)索引應該建在選擇性高的字段上。

(5)索引應該建在小字段上,對於大的文字字段甚至超長字段,不適合建索引。

(6)復合索引的建立需要進行仔細分析。

(7)正確選擇復合索引中的主列字段,一般是選擇性較好的字段。

(8)如果單字段查詢很少甚至沒有,那麼可以建立復合索引;否則考慮單字段索引。

(9)如果復合索引中包含的字段經常單獨出現在where子句中,那麼分解為多個單字段索引。

(10)如果復合索引所包含的字段超過3個,那麼仔細考慮其必要性,考慮減少復合的字段。

(11)如果既有單字段索引,又有這幾個欄位上的復合索引,那麼一般可以刪除復合索引。

(12)頻繁進行dml操作(insert、update、delete)的表,不要建立太多的索引。

(13)刪除無用的索引,避免對執行計畫造成負面影響。

3、索引建立的策略

(1)匯入資料後再建立索引。

(2)不需要為很小的表建立索引。

(3)對於取值範圍很小的字段(比如性別字段)應當建立位圖索引。

(4)限制表中的索引的數目。

(5)為索引設定合適的pctfree值。

(6)儲存索引的表空間最好單獨設定。

4、如何對索引進行操作:

(1)、索引儲存位置——資料庫檔案:

資料庫檔案中儲存著使用者資料(表、索引等)、資料字典、儲存過程、函式和資料報的**、

用來排序的臨時資料以及回滾段資料等。

(2)、檢視索引:

oracle資料字典檢視的種類分別為:user,all 和 dba。

user_*:有關使用者所擁有的物件資訊,即使用者自己建立的物件資訊;

all_*:有關使用者可以訪問的物件的資訊,即使用者自己建立的物件的資訊加上

其他使用者建立的物件但該使用者有權訪問的資訊;

dba_*:有關整個資料庫中物件的資訊

注:如果資料庫中的索引資料很多,盡量避免查詢all_indexes、dba_indexes。

系統檢視存放的是索引名稱,對應的表和列等:

all_ind_columns/dba_ind_columns/user_ind_columns   

select * from user_indexes where table='表名' ;

select * from user_ind_columns where index_name=upper('&index_name');

(3)清理索引碎片

a.合併索引(只是簡單的將b樹葉結點中的儲存碎片合併在一起,並不會改變索引的物理組織結構)

alter index emp_pk coalesce;

b.重建索引(不僅能夠消除儲存碎片,還可以改變索引的全部儲存引數設定,並且可以將索引移動到

其它的表空間中,重建索引實際上就是再指定的表空間中重新建立乙個新的索引,然後刪除原來的索引)

alter index emp_pk rebuild;

(4)刪除索引

drop index emp_ename;

如果索引中包含損壞的資料塊,或者包含過多的儲存碎片,需要首先刪除這個索引,然後再重建它。 

如果索引是在建立約束時由oracle自動產生的,可以通過禁用約束或刪除約束的方法來刪除對應的索引。

在刪除乙個表時,oracle會自動刪除所有與該錶相關的索引。

5、常用到的一些索引操作

(1)查詢一張表裡面索引

select * from user_indexes where table_name=upper('tablename');

(2)查詢被索引字段

select * from user_ind_columns where index_name=('indexname');

(3)給某一欄位建立索引

create index index_name on table_name(col_name);

(4)檢視使用者下的索引

select  * from user_indexes-          -----檢視當前使用者下的所有索引

select * from user_indexes where table_name='a'; -----檢視當前使用者下表a的索引

drop index index_name去掉索引

select index_name,index_type,status,blevel from user_indexes where table_name = '?';

-----檢視某乙個表的所有索引

select table_name, index_name, column_name, column_position from user_ind_columns

where table_name='?'; ----檢視索引的構成

(5)建索引

create unique clustered index 索引名on 表名(欄位1)  --單索引

create index 索引名 on 表名(欄位1,欄位2) -------復合索引

SQL優化之索引

sql優化有很多方法,今天來說一說資料庫索引。舉例說明 假設有乙個圖書book表,裡面有欄位id,name,isbn等。如果圖書數量巨大的話,我們通過isbn查詢通常是比較慢的。新增索引 create index index isbn on book isbn 查詢時間從0.134縮短到0.001,...

SQL優化之索引

舉例說明 假設有乙個圖書book表,裡面有欄位id,name,isbn等。如果圖書數量巨大的話,我們通過isbn查詢通常是比較慢的。這裡寫描述 新增索引 create index index isbn on book isbn 再次執行查詢 這裡寫描述 查詢時間從0.134縮短到0.001,效果還是...

SQL優化之索引使用

最近找工作,遇到乙個面試題 sql哪些關鍵字會忽略索引?因為之前沒這方面的經驗,當時懵逼了,隨便扯了一點。最終有沒能通過面試很遺憾。我們都知道對查詢進行優化,應盡量避免全表掃瞄,多使用索引,首先應考慮在 where 及 order by 涉及的列上建立索引。不過應該注意兩點 1 並不是所有索引對查詢...