Oracle之索引三大特徵

2021-08-09 15:39:52 字數 4153 閱讀 4738

索引**三大特徵:

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.為什麼要使用繼承 繼承的一方可以直接使用被繼承一方已經有的東西。其目的是為了重用已經有的 ...

物件導向三大特徵之封裝

上半句 下半句。三流的書籍和部落格只會告訴你上半句,因為它們的作者自己也不知道下半句,而讓我們接近真理,走的更遠的是下半句。並且下半句往往非常簡單。上半句就是一些半吊子挖出的天坑,就算下半句非常簡單。因為上半句的誤導產生的阻礙,讓無數人很多年也接觸不到講述真理的下半句。時刻警醒 我們要學習的是講述真...