达梦sql查询 Sql 优化
文章目录
- 达梦sql查询 Sql 优化
- 注意点
- 测试数据
- 单表查询 Sort 语句优化
- 优化过程
 
- 多表关联SORT 优化
- 函数索引的使用
 
注意点
- 关于优化过程中工具的选用,推荐使用自带的DM Manage,其它工具在查看执行计划等时候不明确
- 在执行计划中命中顺序是左右边最上边优先执行,同一级上面的先执行

测试数据
-  本次测试的 DM8数据库版本号如下:SELECT * FROM v$version
  
-  主表 
-- SYSDBA.TABLE_CLASS_TEST definitionCREATE TABLE SYSDBA.TABLE_CLASS_TEST (ID VARCHAR(100) NOT NULL,NAME VARCHAR(100) NULL,CODE VARCHAR(100) NULL,TITLE VARCHAR(100) NULL,CREATETIME TIMESTAMP NULL,COLUMN1 VARCHAR(100) NULL,COLUMN2 INTEGER NULL,COLUMN3 VARCHAR(100) NULL,COLUMN4 VARCHAR(300) NULL,COLUMN5 VARCHAR(400) NULL,COLUMN6 VARCHAR(100) NULL,COLUMN7 VARCHAR(10) NULL,CONSTRAINT TAVBLE_CLASS_TEST_PK PRIMARY KEY (ID)
);
CREATE UNIQUE INDEX INDEX33557764 ON SYSDBA.TABLE_CLASS_TEST (ID);
- 子表
CREATE TABLE "SYSDBA"."TABLE_CLASS_TEST_CHILD"
(
"ID" VARCHAR(100) NOT NULL,
"NAME" VARCHAR(100),
"CODE" VARCHAR(100),
"TITLE" VARCHAR(100),
"CREATETIME" TIMESTAMP(6),
"COLUMN1" VARCHAR(100),
"COLUMN2" INTEGER,
"COLUMN3" VARCHAR(100),
"COLUMN4" VARCHAR(300),
CONSTRAINT "TABLE_CLASS_TEST_CHILD" NOT CLUSTER PRIMARY KEY("ID")) STORAGE(ON "MAIN", CLUSTERBTR) ;
- 使用的sql工具达梦自带的客户端工具DM MANAGER
单表查询 Sort 语句优化
- 对于单表查询含有order by的SQL,去掉SORT比较简单,创建对应的索引即可。
优化过程
- 执行sql执行计划
explain
select * from table_class_test where code ='3' order by createtime desc,code desc
- CSCN2

- 给排序字段创建联合排序索引
create index "SYSDBA"."TABLE_CLASS_TEST_ORDER_BY_INDEX1" on "SYSDBA"."TABLE_CLASS_TEST"("CODE" desc,"CREATETIME" desc);
- 更新表索引信息
sp_index_stat_init('SYSDBA','TABLE_CLASS_TEST_ORDER_BY_INDEX1');
- 再次执行sql计划如下,命中排序索引,Sort部分被优化了

多表关联SORT 优化
- join部分列没有索引全表扫描了
explain
select x.*,y.* from table_class_test x join table_class_test_child y on x.code=y.code
where x.code='3'
order by x.code desc

- 给子表code俩个表关联的列增加索引
create index "SYSDBA"."table_class_test_child_code_index1" 
on "SYSDBA"."TABLE_CLASS_TEST_CHILD"("CODE");sp_index_stat_init('SYSDBA','table_class_test_child_code_index1');

- 都命中了索引
函数索引的使用
- 达梦可以创建函数索引,在某些业务中可以考虑使用函数索引例如下面的语句
select * from table_class_test where COLUMN3='3'select * from table_class_test where IFNULL(COLUMN3,'-')='3'
- 创建函数索引
CREATE  INDEX "column3_ifnull_index" ON "SYSDBA"."TABLE_CLASS_TEST"("IFNULL"(COLUMN3, '-')) STORAGE(ON "MAIN", CLUSTERBTR) ;
