达梦数据库查询优化
数据库版本:
DM Database Server x64 V7.1.5.202-Build(2017.07.17-82922)ENT
DB Version: 0x7000a
刚结束接手两个特别长特别复杂又特别慢的sql的优化,记录
优化过程:
- 将复杂查询语句重构,使用CTE代替,分解成多个简单的、命名的子查询。
CTE 只会被执行一次,结果会被缓存;
多次引用同一 CTE 不会导致重复计算;
优化器可以更好地处理查询计划; - 查看执行计划
使用EXPLAIN FOR 查看整体和各个部分的sql执行计划。
改进operation是CSCN2的语句,因为CSCN2全表扫描。如果扫描的行数很大,而最后过滤完的数据较少的话,可以根据筛选条件添加索引。
添加完索引后再次查看执行计划,发现operation变成SSEK2,row_nums也少了很多。 - 分区
我的查询中需要查询一个范围分区表,按时间分区。首先判断查询的时间范围是在一个分区还是有跨分区,
如果是跨分区,我使用的方法是:分成两个语句,然后union all拼起来。
例如:表的分区是:
PARTITION BY RANGE("CREATE_DATE")
(
PARTITION "PART_1" VALUES LESS THAN(DATE'2025-06-30'),
PARTITION "PART_2" VALUES LESS THAN(DATE'2026-01-01')
) STORAGE(ON "MAIN", CLUSTERBTR) ;
查询指定的时间范围是2025.06.01-2025.07.07,那么我的查询语句是:
select * from table_name PARTITION(PART_1) where CREATE_DATE between '2025-06-01' and '2025-06-30'
union all
select * from table_name PARTITION(PART_2) where CREATE_DATE between '2025-07-01' and '2025-07-07'
查看执行计划,发现这样指定分区拼起来比直接查找产生的row_nums、cost、cpu_cost、io_cost小很多。
学习新思想,争做新青年
浙公网安备 33010602011771号