oracle 索引(3)

發表于:2013-08-08來源:博客園作者:蟲師點擊數: 標簽:oracle
4、如果一個表很大,建立索引的時間很長,因為建立索引也會產生大量的redo信息,所以在創建索引時可以設置不產生或少產生redo信息。只要表數據存在,

  4、如果一個表很大,建立索引的時間很長,因為建立索引也會產生大量的redo信息,所以在創建索引時可以設置不產生或少產生redo信息。只要表數據存在,索引失敗了大不了再建,所以可以不需要產生redo信息。

  5、建索引的時候應該根據具體的業務SQL來創建,特別是where條件,還有where條件的順序,盡量將過濾大范圍的放在后面,因為SQL執行是從后往前的。(小李飛菜刀)

  索引常見操作

  改變索引:

  SQL> alter index employees_last _name_idx storage(next 400K maxextents 100);

  索引創建后,感覺不合理,也可以對其參數進行修改。詳情查看相關文檔

  調整索引的空間:

  新增加空間

  SQL> alter index orders_region_id_idx allocate extent (size 200K datafile '/disk6/index01.dbf');

  釋放空間

  SQL> alter index oraers_id_idx deallocate unused;

  索引在使用的過程中可能會出現空間不足或空間浪費的情況,這個時候需要新增或釋放空間。上面兩條命令完成新增與釋放操作。關于空間的新增oracle可以自動幫助,如果了解數據庫的情況下手動增加可以提高性能。

  重新創建索引:

  所引是由oracle自動完成,當我們對數據庫頻繁的操作時,索引也會跟著進行修改,當我們在數據庫中刪除一條記錄時,對應的索引中并沒有把相應的索引只是做一個刪除標記,但它依然占據著空間。除非一個塊中所有的標記全被刪除的時,整個塊的空間才會被釋放。這樣時間久了,索引的性能就會下降。這個時候可以重新建立一個干凈的索引來提高效率。

  SQL> alter index orders_region_id_idx rebuild tablespace index02;

  通過上面的命令就可以重現建立一個索引,oracle重建立索引的過程:

  1、鎖表,鎖表之后其他人就不能對表做任何操作。

  2、創建新的(干凈的)臨時索引。

  3、把老的索引刪除掉

  4、把新的索引重新命名為老索引的名字

  5、對表進行解鎖。

  移動所引:

  其實,我們移動索引到其它表空間也同樣使用上面的命令,在指定表空間時指定不同的表空間。新的索引創建在別位置,把老的干掉,就相當于移動了。

  SQL> alter index orders_region_id_idx rebuild tablespace index03;

  在線重新創建索引:

  上面介紹,在創建索引的時候,表是被鎖定,不能被使用。對于一個大表,重新創建索引所需要的時間較長,為了滿足用戶對表操作的需求,就產生的這種在線重新創建索引。

  SQL> alter index orders_id_idx rebuild online;

  創建過程:

  1、鎖住表

  2、創建立臨時的和空的索引和IOT表用來存在on-going DML。普通表存放的鍵值,IOT所引表直接存放的表中數據;on-gong DML也就是用戶所做的一些增刪改的操作。

  3、對表進行解鎖

  4、從老的索引創建一個新的索引。

  5、IOT表里存放的是on-going DML信息,IOT表的內容與新創建的索引合并。

  6、鎖住表

  7、再次將IOT表的內容更新到新索引中,把老的索引干掉。

  8、把新的索引重新命名為老索引的名字

  9、對表進行解鎖

  整合索引碎片:

  如上圖,在很多索引中有剩余的空間,可以通過一個命令把剩余空間整合到一起。

  SQL> alter index orders_id_idx coalesce;

  刪除索引:

  SQL> drop index hr.departments_name_idx;

  分析索引

  檢查所引的有效果,前面介紹,索引用的時間久了會產生大量的碎片、垃圾信息與浪費的剩余空間了??梢酝ㄟ^重新創建索引來提高所引的性能。

  可以通過一條命令來完成分析索引,分析的結果會存放在在index_stats表中。

復制代碼

  查看存放分析數據的表:

  SQL> select count(*) from index_stats;

  COUNT(*)

  ----------

  0

  執行分析索引命令:

  SQL> analyze index my_bit_idx validate structure;

  Index analyzed.

  再次查看 index_stats 已經有了一條數據

  SQL> select count(*) from index_stats;

  COUNT(*)

  ----------

  1

  把數據查詢出來:

  SQL> select height,name,lf_rows,lf_blks,del_lf_rows from index_stats;

  HEIGHT NAME LF_ROWS LF_BLKS DEL_LF_ROWS

  ---------- ---------------------------------------------------------------------- ---------- -----------

  2 MY_BIT_IDX 1000 3 100

復制代碼

  分析數據分析:

  (HEIGHT)這個所引高度是2 ,(NAME)索引名為MY_BIT_IDX ,(LF_ROWS)所引表有1000行數據,(LF_BLKS)占用3個塊,(DEL_LF_ROWS)刪除100條記錄。

  這里也驗證了前面所說的一個問題,刪除的100條數據只是標記為刪除,因為總的數據條數依然為1000條,占用3個塊,那么每個塊大于333條記錄,只有刪除的數據大于333條記錄,這時一個塊被清空,總的數據條數才會減少。

原文轉自:http://www.cnblogs.com/fnng/archive/2012/10/10/2719221.html

国产97人人超碰caoprom_尤物国产在线一区手机播放_精品国产一区二区三_色天使久久综合给合久久97