达梦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) ;