Oracle索引的新認識

2021-09-01 13:42:49 字數 1652 閱讀 4811

首先,oracle的索引有。

普通索引b*樹,bitmap索引,函式索引,組合索引,反轉索引。

那麼這裡主要說一下常用的索引。

b*樹索引就是普通索引。

使用方式如下:

create index idx_a on my_table(a);
b*樹的組合索引用法如下:

create index idx_a_b on my_table(a,b);
組合索引是普通索引的一種擴充。

每次查詢,cbo會選擇其中的一條索引進行查詢。

所以即使建立了多個單列索引,也只是會選擇一條進行使用。

注意,組合索引的前後順序會有很大的差異。

按照上面的組合索引來說,如果是這種情況:

select * from my_table

where a = *

是可以走 idx_a_b這個索引的。

但是,相對,如果是:

select * from my_table

where b= *

則不會走idx_a_b這個索引了。

所以在使用組合索引的時候,一定要注意前後的順序。

索引也是占用表空間的,至於佔了多少,是可以查的到的。

--(1)檢視索引段中extent的數量:

select segment_name, count(*)

from dba_extents

where segment_type = 'index'

and owner = upper('&owner') --schema 名

group by segment_name

--(2)檢視索引段中的block的數量:

select segment_name, sum(blocks)

from dba_extents

where segment_name = 'sys_c005736' --物件名

group by segment_name;

oracle為資料庫中的所有資料分配邏輯結構空間。

資料庫空間的單位是資料塊(block)、範圍(extent)和段(segment)。

oracle資料塊(block)是oracle使用和分配的最小儲存單位。

它是由資料庫建立時設定的db_block_size決定的。一旦資料庫生成了,資料塊的大小不能改變。

要想改變只能重新建立資料庫。(在oracle9i中有一些不同,不過這不在本文討論的範圍內。)

extent是由一組連續的block組成的。

乙個或多個extent組成乙個segment。

當乙個segment中的所有空間被用完時,oracle為它分配乙個新的extent。

segment是由乙個或多個extent組成的。它包含某錶空間中特定邏輯儲存結構的所有資料。

乙個段中的extent可以是不連續的,甚至可以在不同的資料檔案中。

乙個object只能對應於乙個邏輯儲存的segment,

我們通過檢視該segment中的extent,可以看出相應object的儲存情況。

面對一些海量資料表,選擇適合的索引可以降低儲存大小,降低成本,也能夠提高查詢效率。

const的新認識

今天發現乙個有趣的現象,有如下 void fun char p int main void fun char p 和c d這兩行會出現waring 其實這兩行都是相同的賦值語句,都是有const修飾的賦值給沒有const修飾的。也就是說只能把沒有const修飾的賦值給有const修飾的,反之則war...

MySQL Varchar的新認識

mysql中的char,varvhar以及text型別一直是需要被搞清楚的一回事,他們之間的大致的區別在網上都有。我查了以後發現對於varchar,網上說的是最大長度為65535個位元組 網上說mysql5.0.3之後才有,5.0.3之前varchar的最大值並沒有那麼大,這個說法我並沒有去求證 於...

UML的新認識

中午無事,躺在床上翻看了 程式設計師 今年第8期上的乙個有關uml的專題討論,有些收穫,至少讓我對uml有了點兒新認識。今天讀了這一組文章,終於讓我心裡好受不少。原來,對於uml的認識,不只我乙個人有困惑。uml,作為乙個工具,它是用來幫助我們做事情的,而不能為了uml而uml,為賦新詞強作愁,成了...