索引

數據庫查詢時是會有緩存的:
ORACLE data一般緩存在SGA(系統全局區,System Global Area)中的data cache中 
表A有10000條數據,在0:00時刻對其進行查詢,則將表A的所有數據塊從disk緩存至data cache中。
因此第二次查詢時直接從data cache中獲得速度變快。 2.0:05時刻 對錶A進行更新等操作,20000行。
再次對錶A進行查詢,之前沒有變化的數據塊仍然直接從data cache中直接獲得。發生過變更,或新增的數據塊,
需要重新從disk讀入data cache中,如果data cache空間已滿,就會將之前發生變更的髒數據塊及不常使用的數據塊清空出data cache,
然後緩存新的數據塊。

聯合索引:

create index IDX_EB_JBXX_SORT on EB_JBXX(JDRQ DESC,ZXID DESC);

通用索引:(B樹索引)

create index IDX_EB_JBXX_XB on EB_JBXX(XB);

唯一索引:

create unique  index IDX_EB_JBXX_XB on EB_JBXX(XB);

位圖索引:

create bitmap index IDX_EB_JBXX_XB on EB_JBXX(XB);


主鍵和唯一索引的區別:

主鍵是一種約束,唯一索引是一種索引,兩者在本質上是不同的。
主鍵創建後一定包含一個唯一性索引,唯一性索引並不一定就是主鍵。
唯一性索引列允許空值,而主鍵列不允許爲空值。
主鍵列在創建時,已經默認爲空值 + 唯一索引了。
主鍵可以被其他表引用爲外鍵,而唯一索引不能。
一個表最多隻能創建一個主鍵,但可以創建多個唯一索引。
主鍵更適合那些不容易更改的唯一標識,如自動遞增列、***號等。
在 RBO 模式下,主鍵的執行計劃優先級要高於唯一索引。 兩者可以提高查詢的速度。


位圖索引示例:

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

         1個公司的客戶數據

  CUSTOMER#   MARITAL_STATUS   REGION   GENDER  INCOME_LEVEL

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

  101        single           east     male    bracket_1

  102        married          central  female  bracket_4

  103        married          west     female  bracket_2

  104        divorced         west     male    bracket_4

  105        single           central  female  bracket_2

  106        married          central  female  bracket_3

  MARITAL_STATUS,REGION,GENDER,INCOME_LEVEL字段都是有較少的獨特值(婚姻狀況和地域只有三種值,性別只有2種值,收入級別只有4種值),較爲適合在這些字段上創建位圖索引。但在CUSTOMER#上不適合創建位圖索引,因爲該字段獨特值較多。

  相反,在該字段上創建一個唯一索引,將十分有效。


被索引的列的值更新修改後會導致索引失效

應該建索引列的特點:

1)在經常需要搜索的列上,可以加快搜索的速度;

2)在作爲主鍵的列上,強制該列的唯一性和組織表中數據的排列結構;

3)在經常用在連接的列上,這些列主要是一些外鍵,可以加快連接的速度;

4)在經常需要根據範圍進行搜索的列上創建索引,因爲索引已經排序,其指定的範圍是連續的;

5)在經常需要排序的列上創建索引,因爲索引已經排序,這樣查詢可以利用索引的排序,加快排序查詢時間;

6)在經常使用在WHERE子句中的列上面創建索引,加快條件的判斷速度。


不應該建索引列的特點:

1)對於那些在查詢中很少使用或者參考的列不應該創建索引。這是因爲,既然這些列很少使用到,因此有索引或者無索引,並不能提高查詢速度。相反,由於增加了索引,反而降低了系統的維護速度和增大了空間需求。

2)對於那些只有很少數據值的列也不應該增加索引。這是因爲,由於這些列的取值很少,例如人事表的性別列,在查詢的結果中,結果集的數據行佔了表中數據行的很大比例,即需要在表中搜索的數據行的比例很大。增加索引,並不能明顯加快檢索速度。

3)對於那些定義爲blob數據類型的列不應該增加索引。這是因爲,這些列的數據量要麼相當大,要麼取值很少。

4)當修改性能遠遠大於檢索性能時,不應該創建索引。這是因爲,修改性能和檢索性能是互相矛盾的。當增加索引時,會提高檢索性能,但是會降低修改性能。當減少索引時,會提高修改性能,降低檢索性能。因此,當修改性能遠遠大於檢索性能時,不應該創建索引。



索引掃描優化相關:

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

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

在索引中,除了存儲每個索引的值外,索引還存儲具有此值的行對應的ROWID值

索引掃描可以由2步組成:(1) 掃描索引得到對應的rowid值。 (2) 通過找到的rowid從表中讀出具體的數據。


這兩步每步都是單獨的一次I/O,但是對於索引,由於經常使用,絕大多數都已經CACHE到內存中,所以第1步的I/O經常是邏輯I/O,即數據可以從內存中得到。但是對於第2步來說,如果表比較大,則其數據不可能全在內存中,所以其I/O很有可能是物理I/O,這是一個機械操作,相對邏輯I/O來說,是極其費時間的。所以如果多大表進行索引掃描,取出的數據如果大於總量的5% -- 10%,使用索引掃描會效率下降很多。


索引唯一掃描(index unique scan)


索引範圍掃描(index range scan)


索引全掃描(index full scan)


索引快速掃描(index fast full scan)


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章