# 达梦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) ;
相关推荐
rgeshfgreh7 小时前
Python函数全解析:定义、参数与作用域
前端·数据库·python
亮子AI7 小时前
【MySQL】node.js 如何判断连接池是否正确连接上了?
数据库·mysql·node.js
Chef_Chen7 小时前
数据科学每日总结--Day41--ubuntu安装tailscale
数据库·ubuntu·postgresql
a程序小傲7 小时前
【Node】单线程的Node.js为什么可以实现多线程?
java·数据库·后端·面试·node.js
DBA小马哥10 小时前
时序数据库迁移替换与时序数据库分片
数据库·时序数据库
DBA小马哥10 小时前
时序数据库迁移方案在物联网设备监测中的实践与性能突破
数据库·物联网·时序数据库
ID_1800790547310 小时前
小红书笔记详情API接口基础解析:数据结构与调用方式
数据结构·数据库·笔记
ruleslol16 小时前
MySQL的段、区、页、行 详解
数据库·mysql
while(1){yan}16 小时前
MyBatis Generator
数据库·spring boot·java-ee·mybatis
それども16 小时前
MySQL affectedRows 计算逻辑
数据库·mysql