系统里这个同时查冷热表的sql,动动手指,从8s降到3s

本文涉及的产品
云数据库 RDS SQL Server,基础系列 2核4GB
RDS PostgreSQL Serverless,0.5-4RCU 50GB 3个月
推荐场景:
对影评进行热评分析
云原生数据库 PolarDB 分布式版,标准版 2核8GB
简介: 系统将交易数据按交易时间分为热表(最近3个月)和冷表(3个月前)。为保证用户体验,当企业门户端查询跨越冷热表时,尤其针对大客户,查询性能优化至关重要。以下是程序的SQL查询语句及其优化版本。

系统里的交易数据按交易时间做了冷热表分离(热表仅存储最近3个月的交易数据,3个月前的交易数据自动结转至冷表),我们内部运营系统的交易查询功能进行了冷热数据分开查询。

然后企业客户端呢,为了不影响用户体验,企业门户端的交易查询功能,当选择的查询时间段同时涉及到冷热表时,需要union(合并)两表进行数据查询。这时,尤其是针对那些交易量比较大的客户来说,在查询性能上我们就要做一些努力。

上sql

select
  count(*) as orderNum,
  IFNULL(sum(amount), 0) as totalAmt,
  SUM(CASE WHEN order_status = 'SUCCESS' THEN amount ELSE 0 END) as totalSuccessAmt,
  SUM(CASE WHEN order_status = 'FAIL' THEN amount ELSE 0 END) as totalFailAmt
from
  (
    select
      *
    from
      order_detail
    WHERE
      enterprise_id = 1655100723787649
      and create_time >= '2024-02-04 00:00:00'
      and create_time <= '2024-09-20'
    UNION
    select
      *
    from
      order_detail_mig
    WHERE
      enterprise_id = 1655100723787649
      and create_time >= '2024-02-04 00:00:00'
      and create_time <= '2024-09-20'
  ) od

### 执行计划及耗时

本文sql查询方式:本地通过堡垒机访问生产库,执行耗时15s。(生产log实际耗时≈12s)

id

select_type

table

partitions

type

possible_keys

key

key_len

ref

rows

filtered

Extra

1 PRIMARY <derived2> (null) ALL (null) (null) (null) (null) 403059 100 (null)
2 DERIVED order_detail (null) ref uk_enterprise_order_no,idx_create_time,idx_create_time_payee_account_enterprise_id uk_enterprise_order_no 8 const 376527 50 Using where
3 UNION order_detail_mig (null) ref uk_enterprise_order_no,idx_create_time uk_enterprise_order_no 8 const 429592 50 Using where
4 UNION RESULT <union2,3> (null) ALL (null) (null) (null) (null) (null) (null) Using temporary

image.png


sql优化后v1

先把`UNION`换成`UNION ALL`

### 执行计划及耗时

image.png


sql优化后v2

select
    count(*) as orderNum,
    sum(amount) as totalAmt,
    order_status
from
  order_detail
WHERE
  enterprise_id = 1655100723787649
  and create_time >= '2024-02-04 00:00:00'
  and create_time <= '2024-09-20'
group by order_status
UNION ALL
select
    count(*) as orderNum,
    sum(amount) as totalAmt,
    order_status
from
  order_detail_mig
WHERE
  enterprise_id = 1655100723787649
  and create_time >= '2024-02-04 00:00:00'
  and create_time <= '2024-09-20'
group by order_status


### 执行计划及耗时

image.png


目录
相关文章
|
26天前
|
SQL 数据处理 数据库
SQL进阶之路:深入解析数据更新与删除技巧——掌握批量操作、条件筛选、子查询和事务处理,提升数据库维护效率与准确性
【8月更文挑战第31天】在数据库管理和应用开发中,数据的更新和删除至关重要,直接影响数据准确性、一致性和性能。本文通过具体案例,深入解析SQL中的高级更新(UPDATE)和删除(DELETE)技巧,包括批量更新、基于条件的删除以及使用子查询和事务处理复杂场景等,帮助读者提升数据处理能力。掌握这些技巧能够有效提高数据库性能并确保数据一致性。
44 0
|
2月前
|
SQL 安全 大数据
如何安全的大数据量表在线进行DDL操作
如何安全的大数据量表在线进行DDL操作
42 0
如何安全的大数据量表在线进行DDL操作
|
4月前
|
SQL 关系型数据库 MySQL
简简单单 My SQL 学习笔记(1)——表中数据的整删改查
简简单单 My SQL 学习笔记(1)——表中数据的整删改查
|
3月前
|
SQL 存储 关系型数据库
PolarDB产品使用合集之有的sql里面有自定义存储函数 如果想走列存有什么优化建议吗
PolarDB是阿里云推出的一种云原生数据库服务,专为云设计,提供兼容MySQL、PostgreSQL的高性能、低成本、弹性可扩展的数据库解决方案,可以有效地管理和优化PolarDB实例,确保数据库服务的稳定、高效运行。以下是使用PolarDB产品的一些建议和最佳实践合集。
329 0
|
数据库 UED 索引
索引创建原则:提升数据库性能与查询效率的关键
在现代软件系统中,数据库是一个关键的组成部分,而索引作为提高数据库性能和查询效率的重要手段之一,其设计和创建的合理性直接影响着整个系统的稳定性和响应速度。本文将介绍索引的基本概念和原则,并详细探讨索引创建的几个关键原则,帮助读者了解如何为数据库中的表创建最优的索引,以提升系统性能。
166 0
|
4月前
|
Shell 数据库
数据库第六次作业 查询数据-多条件
数据库第六次作业 查询数据-多条件
60 0
|
4月前
|
数据库
数据库第五次作业 查询数据
数据库第五次作业 查询数据
53 0
【SQL开发实战技巧】系列(七):从有重复数据前提下如何比较出两个表中的差异数据及对应条数聊起
本篇文章讲解的主要内容是:***如果有重复数据如何检查出两个表中的差异数据及对应条数、表连接做聚合容易出现重复计算的错误、多表查询空值处理问题、NOT IN的子查询范围不能是空值,否则查询结果为空。***
【SQL开发实战技巧】系列(七):从有重复数据前提下如何比较出两个表中的差异数据及对应条数聊起
|
SQL Oracle 安全
Oracle优化01-引起数据库性能问题的因素
Oracle优化01-引起数据库性能问题的因素
154 0