# 达梦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) ;
相关推荐
GuWenyue9 分钟前
Cursor黑盒拆解!1套LangChain.js手写Mini编程Agent,自动生成React项目,效率提升60%
前端·数据库·人工智能
Miao121312 小时前
某海外住宿平台如何在大规模场景下实现指标一致性:Minerva 指标平台实践
大数据·数据库·人工智能
CodexDave2 小时前
MySQL事务隔离级别与MVCC机制解析
前端·数据库·mysql·nginx·性能优化·负载均衡
碎光拾影2 小时前
ARM交叉工具链各工具作用及IMX6ULL平台LED+蜂鸣器裸机程序实现
java·开发语言·数据库
曾阿伦2 小时前
MongoDB 查询语句备忘手册
数据库·mongodb
一叶龙洲3 小时前
wslg打开Ubuntu24.04默认打开图形界面
linux·服务器·数据库·ubuntu
CCPC不拿奖不改名3 小时前
大模型推理架构与开源生态知识整理
数据库·windows·python·架构·langchain·开源·github
爬也要爬着前进4 小时前
redis主从搭建
数据库·redis·缓存
@Mike@5 小时前
02-数据库学习笔记(SQL引擎)
数据库·笔记·学习
踏月的造梦星球6 小时前
达梦数据库执行计划与性能分析入门:EXPLAIN、AUTOTRACE 与 ET
服务器·数据库·oracle