# 达梦sql查询 Sql 优化

达梦sql查询 Sql 优化

文章目录

注意点

  • 关于优化过程中工具的选用,推荐使用自带的DM Manage,其它工具在查看执行计划等时候不明确
  • 在执行计划中命中顺序是左右边最上边优先执行,同一级上面的先执行

测试数据

  • 本次测试的DM8数据库版本号如下:SELECT * FROM v$version

  • 主表

sql 复制代码
-- 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);
  • 子表
sql 复制代码
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 bySQL,去掉SORT比较简单,创建对应的索引即可。

优化过程

  • 执行sql执行计划
sql 复制代码
explain
select 
 * from table_class_test where code ='3' order by createtime desc,code desc
  • CSCN2
  • 给排序字段创建联合排序索引
sql 复制代码
create index "SYSDBA"."TABLE_CLASS_TEST_ORDER_BY_INDEX1" on "SYSDBA"."TABLE_CLASS_TEST"("CODE" desc,"CREATETIME" desc);
  • 更新表索引信息
sql 复制代码
sp_index_stat_init('SYSDBA','TABLE_CLASS_TEST_ORDER_BY_INDEX1');
  • 再次执行sql计划如下,命中排序索引,Sort部分被优化了

多表关联SORT 优化

  • join部分列没有索引全表扫描了
sql 复制代码
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俩个表关联的列增加索引
sql 复制代码
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');
  • 都命中了索引

函数索引的使用

  • 达梦可以创建函数索引,在某些业务中可以考虑使用函数索引例如下面的语句
sql 复制代码
select * from table_class_test where COLUMN3='3'

select * from table_class_test where IFNULL(COLUMN3,'-')='3'
  • 创建函数索引
sql 复制代码
CREATE  INDEX "column3_ifnull_index" ON "SYSDBA"."TABLE_CLASS_TEST"("IFNULL"(COLUMN3, '-')) STORAGE(ON "MAIN", CLUSTERBTR) ;
相关推荐
远歌已逝1 小时前
维护在线重做日志(二)
数据库·oracle
qq_433099402 小时前
Ubuntu20.04从零安装IsaacSim/IsaacLab
数据库
Dlwyz2 小时前
redis-击穿、穿透、雪崩
数据库·redis·缓存
工业甲酰苯胺4 小时前
Redis性能优化的18招
数据库·redis·性能优化
没书读了5 小时前
ssm框架-spring-spring声明式事务
java·数据库·spring
i道i5 小时前
MySQL win安装 和 pymysql使用示例
数据库·mysql
小怪兽ysl5 小时前
【PostgreSQL使用pg_filedump工具解析数据文件以恢复数据】
数据库·postgresql
wqq_9922502776 小时前
springboot基于微信小程序的食堂预约点餐系统
数据库·微信小程序·小程序
爱上口袋的天空6 小时前
09 - Clickhouse的SQL操作
数据库·sql·clickhouse
聂 可 以7 小时前
Windows环境安装MongoDB
数据库·mongodb