達夢資料庫 關於不走索引的各種神話

2021-10-07 14:41:41 字數 4846 閱讀 9219

案例1:條件列不是索引的首列

--建立表

create table tab1(c1 int,c2 char(1),c3 char(1),c4 int);

--構造測試資料

insert into tab1

select level c1,chr(mod(level,27)+65) c2,chr(mod(level,27)+65) c3,level c4

from dual

connect by level<=10000;

commit;

create index idx_c1_c2 on tab1(c1,c2);

explain select * from tab1 where c2='a';

1 #nset2: [1, 250, 112]

2 #prjt2: [1, 250, 112]; exp_num(5), is_atom(false)

3 #slct2: [1, 250, 112]; tab1.c2 = a

4 #cscn2: [1, 10000, 112]; index33556684(tab1)

案例2:條件列上有函式或計算

--正常情況

explain select * from tab1 where c1 =123;

1 #nset2: [0, 1, 112]

2 #prjt2: [0, 1, 112]; exp_num(5), is_atom(false)

3 #blkup2: [0, 1, 112]; idx_c1_c2_c3_tab1(tab1)

#ssek2: [0, 1, 112]; scan_type(asc), idx_c1_c2_c3_tab1(tab1), scan_range[(123,min,min),(123,max,max))

--條件列上有函式

explain select * from tab1 where abs(c1) =123;

1 #nset2: [137, 25000, 112]

2 #prjt2: [137, 25000, 112]; exp_num(5), is_atom(false)

3 #slct2: [137, 25000, 112]; exp11 = var1

#cscn2: [137, 1000000, 112]; index33556691(tab1)

--條件列上有計算explain select * from tab1 where c1-1 =123;

1 #nset2: [137, 25000, 112]

2 #prjt2: [137, 25000, 112]; exp_num(5), is_atom(false)

3 #slct2: [137, 25000, 112]; tab1.c1-1 = 123

#cscn2: [137, 1000000, 112]; index33556691(tab1)

explain select * from tab1 where c1 =123+1

1 #nset2: [0, 1, 112]

2 #prjt2: [0, 1, 112]; exp_num(5), is_atom(false)

3 #blkup2: [0, 1, 112]; idx_c1_c2_c3_tab1(tab1)

4 #ssek2: [0, 1, 112]; scan_type(asc), idx_c1_c2_c3_tab1(tab1), scan_range[(123+1,min,min),(123+1,max,max))

案例3:存在隱式型別轉換

--對條件列c1做了隱式的型別轉換,將int型別轉換為char型別

explain select * from tab1 where c1='1234567890'

1 #nset2: [137, 25000, 112]

2 #prjt2: [137, 25000, 112]; exp_num(5), is_atom(false)

3 #slct2: [137, 25000, 112]; exp_cast(tab1.c1) = var1

#cscn2: [137, 1000000, 112]; index33556691(tab1)

--後面的常量小於10位,優化器對常量做了型別轉換,這時可以走索引

explain select * from tab1 where c1='123456789'

1 #nset2: [0, 1, 112]

2 #prjt2: [0, 1, 112]; exp_num(5), is_atom(false)

3 #blkup2: [0, 1, 112]; idx_c1_c2_c3_tab1(tab1)

#ssek2: [0, 1, 112]; scan_type(asc), idx_c1_c2_c3_tab1(tab1), scan_range[(exp_cast(123456789),min,min),(exp_cast(123456789),max,max))

--寫sql的時候資料型別最好匹配,不要讓優化器來做這種隱式的型別轉換

explain select * from tab1 where c1=1234567890

1 #nset2: [0, 1, 112]

2 #prjt2: [0, 1, 112]; exp_num(5), is_atom(false)

3 #blkup2: [0, 1, 112]; idx_c1_c2_c3_tab1(tab1)

4 #ssek2: [0, 1, 112]; scan_type(asc), idx_c1_c2_c3_tab1(tab1), scan_range[(1234567890,min,min),(1234567890,max,max))

案例4:如果走索引會更慢

--建立測試表

create table tx(id int, name varchar(100));

--插入資料

begin

for x in 1 .. 100000 loop

insert into tx values(x, 'hello');

end loop;

commit;

end;

--建立索引 更新統計資訊

create index txl01 on tx(id);

sp_index_stat_init(user,'txl01');

--返回記錄較多 不走索引

explain select * from tx where id <50000;

1 #nset2: [12, 49998, 60]

2 #prjt2: [12, 49998, 60]; exp_num(3), is_atom(false)

3 #slct2: [12, 49998, 60]; tx.id < 50000

#cscn2: [12, 100000, 60]; index33556697(tx)

--返回記錄較少 走索引

explain select * from tx where id <500;

1 #nset2: [8, 498, 60]

2 #prjt2: [8, 498, 60]; exp_num(3), is_atom(false)

3 #blkup2: [8, 498, 60]; txl01(tx)

4 #ssek2: [8, 498, 60]; scan_type(asc), txl01(tx), scan_range(null2,500)

案例5:沒有更新統計資訊

--建立測試表

create table ty(id int, name varchar(100));

--插入資料

begin

for x in 1 .. 100000 loop

insert into ty values(x, 'hello');

end loop;

commit;

end;

--建立索引

create index tyl01 on ty(id);

--未更新統計資訊

explain select * from ty where id <500;

1 #nset2: [12, 5000, 60]

2 #prjt2: [12, 5000, 60]; exp_num(3), is_atom(false)

3 #slct2: [12, 5000, 60]; ty.id < 500

#cscn2: [12, 100000, 60]; index33556699(ty)

--更新統計資訊

sp_index_stat_init(user,'tyl01');

explain select * from ty where id <500;

1 #nset2: [8, 498, 60]

2 #prjt2: [8, 498, 60]; exp_num(3), is_atom(false)

3 #blkup2: [8, 498, 60]; tyl01(ty)

4 #ssek2: [8, 498, 60]; scan_type(asc), tyl01(ty), scan_range(null2,500)

達夢資料庫和mysql索引引擎 達夢資料庫 索引

1.索引的種類和功能 聚集索引 每乙個普通表有且只有乙個聚集索引 唯一索引 索引資料根據索引鍵唯一 函式索引 包含函式 表示式的預先計算的值 位圖索引 對低基數的列建立位圖索引 位圖連線索引 針對兩個或者多個表連線的點陣圖索引,主要用於資料倉儲中 全文索引 在表的文字列上而建的索引。2.何時使用索引...

達夢資料庫的索引管理

在關聯式資料庫中,索引是一種單獨的 物理的對資料庫表中一列或多列的值進行排序的一種儲存結構,它是某個表中一列或若干列值的集合和相應的指向表中物理標識這些值的資料頁的邏輯指標清單。達夢支援的索引 二級索引,位圖索引,唯一索引,復合索引,函式索引,分割槽索引等。一 建立索引的規則 適合建索引的情況 經常...

關於學習達夢資料庫的感想

現代社會,管理是人們生產生活不可或缺的活動,而怎麼有效管理也是人們一直在 的話題。在大資料時代中,資料的管理又是重中之重,其中包括資料的儲存 查詢 更新 分析等等。為了更好的管理這些生活生產的重要資料,這時候資料庫就發揮作用了。資料庫是 按照資料結構來組織 儲存和管理資料的倉庫 是乙個長期儲存在計算...