达梦sql查询 Sql 优化
文章目录
- 达梦sql查询 Sql 优化
- 注意点
- 测试数据
- 单表查询 Sort 语句优化
- 优化过程
- 多表关联SORT 优化
- 函数索引的使用
注意点
- 关于优化过程中工具的选用,推荐使用自带的
DM Manage
,其它工具在查看执行计划等时候不明确 - 在执行计划中命中顺序是左右边最上边优先执行,同一级上面的先执行
测试数据
-
本次测试的
DM8
数据库版本号如下:SELECT * FROM v$version
-
主表
-- SYSDBA.TABLE_CLASS_TEST definition
CREATE 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) ;