達夢索引測試


達夢索引測試

索引是對數據庫表中一列或多列的值進行排序的一種結構,使用索引可減少IO,快速訪問數據庫表中的特定信息。索引需要額外的磁盤空間,並降低寫操作的性能。在修改表內容的時候,索引會進行更新甚至重構,索引列越多,這個時間就會越長。所以只保持需要的索引有利於查詢即可。

建設原則:

1索引應該經常建在Where 子句經常用到的列上。如果某個大表經常使用某個字段進行查詢,並且檢索行數小於總表行數的5%。則應該考慮。(返回數據量占10%以上 建議使用全表掃描,使用多塊讀操作,提升吞吐量)。

2 在經常存取的多個列上建立復合索引,但要注意復合索引的建立順序(先等值再其他,返回數據量,使用頻率)

3 對於小型的表,沒必要建立索引,優化不明顯,增加開銷

4 隨着數據的變化,索引的效率會下降,因此應定期重建索引

alter index index_name rebuild

CSCN :基礎全表掃描(a),從頭到尾,全部掃描
SSCN :二級索引掃描(b), 從頭到尾,全部掃描
SSEK :二級索引范圍掃描(b) ,通過鍵值精准定位到范圍或者單值
CSEK :聚簇索引范圍掃描(c) ,通過鍵值精准定位到范圍或者單值
BLKUP :根據二級索引的ROWID 回原表中取出全部數據(b + a)

創建測試表

create table idx (id int,name varchar(50),count int)

構造10萬條測試數據

CREATE OR REPLACE PROCEDURE proc_index AS

begin

for i in 1..100000 loop

INSERT INTO  idx (id,name,count)  select i,CHR(MOD(i,27)+65),convert(int,100*rand()) from dual;

end loop;

commit;

end;

調用存儲過程,可以看到idx有10萬條數據,name為A的有3千多條

call PROC_INDEX

 

沒建索引之前,查看執行計划

如下示例,執行計划走了全表掃描CSCN

 

 創建索引,查看執行計划

create index index_t on idx (name)

 explain select /*+INDEX(idx, index_t) */ *  from idx where name='A'

下圖可以看到,執行計划走了二級索引范圍掃描SSEK

 

創建聚集索引

create cluster index index_t2 on idx(id);

explain select * from idx where id >1000 and id <2000

如下所示,執行計划走了聚簇索引范圍掃描CSEK

 

創建組合索引

create index index_t3 on idx(name,count)

explain select  /*+INDEX(idx, index_t3) */ * from idx where  name='A' and count=50

 

刪除組合索引,查看執行計划

drop index index_t3

 

下列情況不走索引

索引列上使用函數

 

 索引列上進行計算

 

索引列上使用IS NULL和IS NOT NULL

 

索引列上做了隱式轉換(經測試,實際上走了索引)

 

返回結果過多

1 聚集索引創建之后執行計划都能走索引

 

2 經測試,除了聚集索引,其他索引如不加hint,執行計划還是走的全表掃描

create index index_t5 on idx(count);

3 加hint之后,執行計划雖走了索引,因返回值過多,開銷太大,優化不明顯

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM