普通堆表不足之處:
--分區表刪除 alter table range_part_tab truncate partition p9; --分區表交換 alter table range_part_tab exchange partition p9 with table mid_table; --分區表的分割 alter table range_part_tab split partition p_max at(to_date('2013-02-01','YYYY-MM-DD'))into (partition p2013_01,partition p_max); --分區表合並 alter table range_part_table merge partitions p2013_01,p_max into partition p_max;
select max(object_id) from t; select max,min from (select max(object_id) max from t) a,(select min(object_id) min from t) b;
select * from t where object_id <=5;
Union,對兩個結果集進行並集操作,不包括重復行,同時進行默認規則的排序;
Union All,對兩個結果集進行並集操作,包括重復行,不進行排序;
主外鍵:
1 主鍵本身是一種索引
2 可以保證表中主鍵所在列的唯一性
3 可以有效的限制外鍵依賴的表的記錄的完整性
如果某個表建立的索引過多,插入數據的時候會很慢。可以刪除索引后,插入,再建立索引。可以優化很大一部分的時間。
索引過多,對三種操作的影響:
1 對insert影響最大,只要有索引,就會變慢,越多越慢。
2 對delete來說,有好有壞,在海量數據刪除較少數據的時候,很有用。但是過多的索引,也會使得其他的索引進行更新時代價變大。
3 對update的影響最小。
建立索引會引起整個表的鎖,使得表被掛起,任何操作無法執行。
alter index 索引名 monitoring usage;
select * from v$object_usage;--查詢索引是否被使用 alter index 索引名 nomonitoring usage;--解鎖索引監控
位圖索引允許存儲為空值(缺點,進行插入的時候,同一個索引的值相同,是插不進去的)
建立位圖索引適合的兩個條件:1 位圖索引列大量重復 2 該表極少更新
為什么位圖索引只適用於低基數值,但是對頻繁更新的列不適用。
原因在於,PROCESSED_FLAG列只有兩個值:Y和N。對於插入到表中的記錄,該列值為N(表示未處理)。其他進程讀取和處理這個記錄時,就會把該列值從N更新為Y。這些進程要很快地找出PROCESSED_FLAG列值為N的記錄,所以開發人員知道,應該對這個列建立索引。他們在別處了解到,位圖索引適用於低基數(low-cardinality)列,所謂低基數列就是指這個列只有很少的可取值,所以看上去位圖索引是一個很自然的選擇。
不過,所有問題的根由正是這個位圖索引。采用位圖索引,一個鍵指向多行,可能數以百計甚至更多。如果更新一個位圖索引鍵,那么這個鍵指向的數百條記錄會與你實際更新的那一行一同被有效地鎖定。
所以,如果有人插入一條新記錄(PROCESSED_FLAG列值為N),就會鎖定位圖索引中的N鍵,而這會有效地同時鎖定另外數百條PROCESSED_FLAG列值為N的記錄(以下記作N記錄)。此時,想要讀這個表並處理記錄的進程就無法將N記錄修改為Y記錄(已處理的記錄)。原因是,要想把這個列從N更新為Y,需要鎖定同一個位圖索引鍵。實際上,想在這個表中插入新記錄的其他會話也會阻塞,因為它們同樣想對這個位圖索引鍵鎖定。簡單地講,開發人員實現了這樣一組結構,它一次最多只允許一個人插入或更新!
可以用一個簡單的例子說明這種情況。在此,使用兩個會話來展示阻塞很容易發生:
ORA10G> create table t ( processed_flag varchar2(1) );
Table created.
ORA10G> create bitmap index t_idx on t(processed_flag);
Index created.
ORA10G> insert into t values ( 'N' );
1 row created.
現在,如果在另一個SQL*Plus會話中執行以下命令:
ORA10G> insert into t values ( 'N' );
這條語句就會“掛起”,直到在第一個阻塞會話中發出COMMIT為止。