# 达梦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) ;
相关推荐
码农老起24 分钟前
企业如何通过TDSQL实现高效数据库迁移与性能优化
数据库·性能优化
夏木~1 小时前
Oracle 中什么情况下 可以使用 EXISTS 替代 IN 提高查询效率
数据库·oracle
W21551 小时前
Liunx下MySQL:表的约束
数据库·mysql
黄名富2 小时前
Redis 附加功能(二)— 自动过期、流水线与事务及Lua脚本
java·数据库·redis·lua
言、雲2 小时前
从tryLock()源码来出发,解析Redisson的重试机制和看门狗机制
java·开发语言·数据库
一个程序员_zhangzhen2 小时前
sqlserver新建用户并分配对视图的只读权限
数据库·sqlserver
zfj3212 小时前
学技术学英文:代码中的锁:悲观锁和乐观锁
数据库·乐观锁··悲观锁·竞态条件
吴冰_hogan2 小时前
MySQL InnoDB 存储引擎 Redo Log(重做日志)详解
数据库·oracle
nbsaas-boot3 小时前
探索 JSON 数据在关系型数据库中的应用:MySQL 与 SQL Server 的对比
数据库·mysql·json
cmdch20173 小时前
Mybatis加密解密查询操作(sql前),where要传入加密后的字段时遇到的问题
数据库·sql·mybatis