索引**三大特徵:
1.索引的高度較低
索引高度較低的學習:
隨著資料的不斷增多,從底層的block塊開始,如果儲存滿了會向上儲存目錄,但是向上增長緩慢,查詢資料的以後從最上級開始向下查詢,一層乙個io,大量資料主要在吞吐量緩慢。
測試:可以建立表插入資料,然後建立索引,然後用hitns進行全表掃瞄,檢視執行計畫看consistent gets數量。
例子:drop table t1 purge;
drop table t2 purge;
drop table t3 purge;
drop table t4 purge;
drop table t5 purge;
drop table t6 purge;
drop table t7 purge;
create table t1 as select rownum as id ,rownum+1 as id2,rpad('*',1000,'*') as contents from dual connect by level<=1;
create table t2 as select rownum as id ,rownum+1 as id2,rpad('*',1000,'*') as contents from dual connect by level<=10;
create table t3 as select rownum as id ,rownum+1 as id2,rpad('*',1000,'*') as contents from dual connect by level<=100;
create table t4 as select rownum as id ,rownum+1 as id2,rpad('*',1000,'*') as contents from dual connect by level<=1000;
create table t5 as select rownum as id ,rownum+1 as id2,rpad('*',1000,'*') as contents from dual connect by level<=10000;
create table t6 as select rownum as id ,rownum+1 as id2,rpad('*',1000,'*') as contents from dual connect by level<=100000;
create table t7 as select rownum as id ,rownum+1 as id2,rpad('*',1000,'*') as contents from dual connect by level<=1000000;
create index idx_id_t1 on t1(id);
create index idx_id_t2 on t2(id);
create index idx_id_t3 on t3(id);
create index idx_id_t4 on t4(id);
create index idx_id_t5 on t5(id);
create index idx_id_t6 on t6(id);
create index idx_id_t7 on t7(id);
set linesize 1000
set autotrace off
select index_name,
blevel,
leaf_blocks,
num_rows,
distinct_keys,
clustering_factor
from user_ind_statistics
where table_name in( 't1','t2','t3','t4','t5','t6','t7');
2.儲存列值:列值+rowid
3.本身有序
例子:優化count(*),如果列值存在null那麼索引將失效。在列值上加上索引,count(*)會走索引。
補充:sum等也會走索引
例子:select id from t order by id; 檢視執行計畫不會產生sorts(memory),因為索引本身就是排序的
例子:select max(id) from t;速度異常快,因為不論表的資料如何增加,max min是在固定位置的,所以查詢很快。
例子:union無法優化,索引無法消除union排序,一般來說使用union存在必要性,在資料不會重複時候用union all
例子:索引之排序
drop table t purge;
create table t as select * from dba_objects ;
set autotrace traceonly
--oracle還算智慧型,不會傻到這裡都去排序,做了查詢轉換,忽略了這個排序
select count(*) from t order by object_id;
---以下語句說明排序
set autotrace traceonly
set linesize 1000
drop table t purge;
create table t as select * from dba_objects;
--以下語句沒有索引又有order by ,必然產生排序
select * from t where object_id>2 order by object_id;
---新增索引後,oracle就有可能利用索引本身就有序的特點,利用索引來避免排序,如下:
create index idx_t_object_id on t(object_id);
set autotrace traceonly
select * from t where object_id>2 order by object_id;
--如下情況oracle肯定毫不猶豫的選擇用索引,因為回表取消了 !
select object_id from t where object_id>2 order by object_id;
例子:索引值max/min查詢
--max/min 的索引優化
drop table t purge;
create table t as select * from dba_objects;
update t set object_id=rownum;
alter table t add constraint pk_object_id primary key (object_id);
set autotrace on
set linesize 1000
select max(object_id) from t;
--最小值老師的試驗就無需展現執行計畫結果了,必然和最大值的執行計畫一樣!
select min(object_id) from t;
--如果沒用到索引的情況是如下,請看看執行計畫有何不同,請看看代價和邏輯讀的差異!
select /*+full(t)*/ max(object_id) from t;
---另外,可以做如下試驗觀察在有索引的情況下,隨這記錄數增加,效能差異是否明顯?
set autotrace off
drop table t_max purge;
create table t_max as select * from dba_objects;
insert into t_max select * from t_max;
insert into t_max select * from t_max;
insert into t_max select * from t_max;
insert into t_max select * from t_max;
insert into t_max select * from t_max;
select count(*) from t_max;
create index idx_t_max_obj on t_max(object_id);
set autotrace on
select max(object_id) from t_max;
補充知識:
index full scan (min/max)
table access by index rowid(回表)
C 三大特徵之繼承
c 有三大特徵,封裝 繼承與多型,在本篇文章中,與大家來聊一聊繼承。繼承的本質就是 的復用。簡單的說,繼承是指乙個物件直接使用另一物件的屬性和方法。c 中的繼承關係就好比現實生活中的父子關係,繼承一筆財產比白手起家要容易得多,原始類稱為基類,繼承類稱為派生類,它們是類似於父親和兒子的關係,所以也分別...
oop三大特徵之繼承
1.什麼是繼承 繼承是一種關係,描述兩個物件之間,什麼是什麼的物件。在程式中,繼承描述的是類與類之間的關係。例如a繼承了b,a就能直接使用b已經存在的方法和屬性,其中a稱之為子類,b稱之為父類,也稱為基類。2.為什麼要使用繼承 繼承的一方可以直接使用被繼承一方已經有的東西。其目的是為了重用已經有的 ...
物件導向三大特徵之封裝
上半句 下半句。三流的書籍和部落格只會告訴你上半句,因為它們的作者自己也不知道下半句,而讓我們接近真理,走的更遠的是下半句。並且下半句往往非常簡單。上半句就是一些半吊子挖出的天坑,就算下半句非常簡單。因為上半句的誤導產生的阻礙,讓無數人很多年也接觸不到講述真理的下半句。時刻警醒 我們要學習的是講述真...