oracle之sql優化-索引的基本原理(二)。
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 並不是所有索引對查詢...