達夢索引測試
索引是對數據庫表中一列或多列的值進行排序的一種結構,使用索引可減少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之后,執行計划雖走了索引,因返回值過多,開銷太大,優化不明顯