首先,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,為賦新詞強作愁,成了...