2011-08-30 24 views
4

一般來說,表上的每個索引都會將INSERT插入表 減慢三倍;兩個索引通常使插入兩次,因爲一個索引緩慢。 (然而,兩部分單指數並不比單部分單指數差很多 )。兩部分單指數是什麼意思?

我從書上的Oracle 9i的性能優化技巧和技術由Richard Niemiec(奧斯本甲骨文新聞系列)得到這個。

是什麼下列用語的含義:

  1. 兩部分單項指標
  2. 單部分單項指標
  3. 是否有其他類型的指標?

回答

7

通過兩部分索引,我假定Rich意味着一個複合索引,即構建在多個列上的索引。像這樣:

create index t23_t_idx on t23 (col4, col2); 

雖然單個部件索引索引的單個列:

create index t23_s_idx on t23(col1); 

上面創建的索引是B樹索引。 Oracle還有許多其他類型的索引。對於初學者來說,索引可以是唯一的,在這種情況下,索引只允許索引列中給定值的一個實例(或組合列的值的置換)。

也有位映射索引,這會對DML施加更高的性能損失,但會加快某些類型的查詢速度;在數據倉庫外部遇到位圖索引是很少見的。

我們可以創建基於函數的索引,使我們能夠索引確定性函數的結果(即保證爲給定輸入產生相同結果的索引)。這是我們如何在忽略時間元素的日期列上建立索引:

create index t23_fbi_idx on t23(trunc(col_34)); 

我們還可以在文本列上構建域索引。並且有分區表的特殊索引。

所有這些都在文檔中有更詳細的介紹。 Find out more

4

由於作者似乎沒有實際定義過這個術語,我只能猜測他們的意思是兩部分單索引是一個由兩列組成的組合鍵,單部分單索引是基於一列。

5

我假設作者在談到「兩部分單一索引」時指的是複合索引。術語「組合索引」是一種更常用的方式來引用表的多個列上的索引。

如果您在兩列上有單個複合索引,那麼在插入過程中只需要維護一個索引結構,這樣索引維護的開銷與維護一個單列索引的開銷並無太大區別。

CREATE TABLE t1 (
    col1 NUMBER, 
    col2 NUMBER, 
    col3 NUMBER 
); 

CREATE INDEX t1_composite_idx 
    ON t1(col1, col2); 

在另一方面,如果在每個列創建單獨的索引獨立,Oracle必須維護兩個單獨的索引結構,這確實是需要

CREATE TABLE t1 (
    col1 NUMBER, 
    col2 NUMBER, 
    col3 NUMBER 
); 

CREATE INDEX t1_idx1 
    ON t1(col1); 

CREATE INDEX t1_idx2 
    ON t1(col2); 

我的索引維護大體量的兩倍但是,作者引用的「三分之一」將是相當悲觀的。有很多變數起作用,並不是由特定的經驗法則捕捉到的。記住,添加索引會對插入操作帶來潛在的巨大成本,但在衡量創建另一個索引時的權衡時衡量實際成本更加有用。

有沒有更多類型的索引?

至於你的最後一個問題 - 甲骨文有很多不同類型的索引(特別是如果我們將複合索引計爲不同類型的索引)。這個答案已經完全處理了b * -tree索引,這些索引是人們通常在沒有限定詞的情況下提到「索引」時的意思。但是,Oracle支持許多不同類型的索引 - b * - 樹索引,位圖索引,文本索引等。它創建LOB索引。它支持用戶定義的可擴展索引。在每種類型的指數中,通常有幾十種不同的選擇。例如,您可以創建基於函數的b * -tree索引或位圖連接索引,可以爲Oracle Text索引指定自定義詞法分析器,也可以爲自己的自定義類型定義自己的索引結構。