Sql优化实战

简介: Sql优化实战

公众号merlinsea


  • 涉及的表
  • TRANSACTIONS
  • 表字段
  • TRANSACTION_ID唯一键
  • transaction_type记录类型 TRANSACTION_TYPE
  • TRANID订单号
  • CREATE_DATE创建时间
  • TRANSACTION_LINK
  • 表字段
  • APPLIED_TRANSACTION_ID子记录订单号,取自TRANSACTIONS表的TRANSACTION_ID
  • ORIGINAL_TRANSACTION_ID父记录订单号,取自TRANSACTIONS表的TRANSACTION_ID

640.png

  • 说明:TRANSACTIONS表中既有父记录也有子记录,哪个是子记录,哪个是父记录可以通过TRANSACTION_LINK表进行区分。
  • 需求

  • 给出若干订单号,如果订单号是子记录的id,则查询出这个子记录的信息以及和这个子记录相关的父记录的信息; 如果订单号是父记录的id,则查询出这个父记录的信息以及和这个父记录相关的子记录的信息。
  • 耗时sql


SELECT 
l.APPLIED_TRANSACTION_ID  as 子记录ID,
t.transaction_type as 子记录类型,
t.TRANID as 子记录订单号,
t.CREATE_DATE as 子记录创建时间,
l.ORIGINAL_TRANSACTION_ID  as 父记录ID,
t1.transaction_type as 父记录类型,
t1.TRANID as 父记录订单号,
t1.CREATE_DATE as 父记录创建时间
from transactions t 
left join TRANSACTION_LINKS l on t.TRANSACTION_ID = l.APPLIED_TRANSACTION_ID 
left join TRANSACTIONS t1 on t1.transaction_id = l.ORIGINAL_TRANSACTION_ID 
-- WHERE l.APPLIED_TRANSACTION_ID in (${id}) or l.ORIGINAL_TRANSACTION_ID in (${id})
where t.tranid in (${id}) or t1.tranid in (${id})


sql执行结果[耗时200+]

640.png


  • 优化后的sql


-- 把输入id作为子记录id的查询条件
SELECT 
l.APPLIED_TRANSACTION_ID  as 子记录ID,
t.transaction_type as 子记录类型,
t.TRANID as 子记录订单号,
t.CREATE_DATE as 子记录创建时间,
l.ORIGINAL_TRANSACTION_ID  as 父记录ID,
t1.transaction_type as 父记录类型,
t1.TRANID as 父记录订单号,
t1.CREATE_DATE as 父记录创建时间
from(
  SELECT *
  from transactions
  where tranid in (${id})
) t
left join TRANSACTION_LINKS l on t.TRANSACTION_ID = l.APPLIED_TRANSACTION_ID
left join transactions t1 on  t1.transaction_id = l.ORIGINAL_TRANSACTION_ID 
union
-- 把输入id作为父记录的查询条件
SELECT 
l.APPLIED_TRANSACTION_ID  as 子记录ID,
t.transaction_type as 子记录类型,
t.TRANID as 子记录订单号,
t.CREATE_DATE as 子记录创建时间,
l.ORIGINAL_TRANSACTION_ID  as 父记录ID,
t1.transaction_type as 父记录类型,
t1.TRANID as 父记录订单号,
t1.CREATE_DATE as 父记录创建时间
from(
  SELECT *
  from transactions
  where tranid in (${id})
) t1
left join TRANSACTION_LINKS l on t1.TRANSACTION_ID = l.ORIGINAL_TRANSACTION_ID
left join transactions t on t.TRANSACTION_ID = l.APPLIED_TRANSACTION_ID


执行结果[耗时844毫秒]:

640.png


  • 优化思路
  • where条件往前提,把主表的记录数降低
  • or查询条件可以转化为union联合查询


算法vip班级训练营报名详情

奔跑的小梁,公众号:梁霖编程工具库算法训练营春节价格通知,2023年2月12日


相关文章
|
1月前
|
SQL 缓存 监控
大厂面试高频:4 大性能优化策略(数据库、SQL、JVM等)
本文详细解析了数据库、缓存、异步处理和Web性能优化四大策略,系统性能优化必知必备,大厂面试高频。关注【mikechen的互联网架构】,10年+BAT架构经验倾囊相授。
大厂面试高频:4 大性能优化策略(数据库、SQL、JVM等)
|
18天前
|
SQL 缓存 数据库
SQL慢查询优化策略
在数据库管理和应用开发中,SQL查询的性能优化至关重要。慢查询优化不仅可以提高应用的响应速度,还能降低服务器负载,提升用户体验。本文将详细介绍针对SQL慢查询的优化策略。
|
18天前
|
SQL 存储 BI
gbase 8a 数据库 SQL合并类优化——不同数据统计周期合并为一条SQL语句
gbase 8a 数据库 SQL合并类优化——不同数据统计周期合并为一条SQL语句
|
18天前
|
SQL 数据库
gbase 8a 数据库 SQL优化案例-关联顺序优化
gbase 8a 数据库 SQL优化案例-关联顺序优化
|
25天前
|
SQL 数据库 UED
SQL性能提升秘籍:5步优化法与10个实战案例
在数据库管理和应用开发中,SQL查询的性能优化至关重要。高效的SQL查询不仅可以提高应用的响应速度,还能降低服务器负载,提升用户体验。本文将分享SQL优化的五大步骤和十个实战案例,帮助构建高效、稳定的数据库应用。
40 3
|
1月前
|
SQL 存储 缓存
如何优化SQL查询性能?
【10月更文挑战第28天】如何优化SQL查询性能?
107 10
|
1月前
|
SQL 存储 缓存
SQL Server 数据太多如何优化
11种优化方案供你参考,优化 SQL Server 数据库性能得从多个方面着手,包括硬件配置、数据库结构、查询优化、索引管理、分区分表、并行处理等。通过合理的索引、查询优化、数据分区等技术,可以在数据量增大时保持较好的性能。同时,定期进行数据库维护和清理,保证数据库高效运行。
|
25天前
|
SQL 缓存 监控
SQL性能提升指南:五大优化策略与十个实战案例
在数据库性能优化的世界里,SQL优化是提升查询效率的关键。一个高效的SQL查询可以显著减少数据库的负载,提高应用响应速度,甚至影响整个系统的稳定性和扩展性。本文将介绍SQL优化的五大步骤,并结合十个实战案例,为你提供一份详尽的性能提升指南。
45 0
|
2月前
|
SQL 资源调度 分布式计算
如何让SQL跑快一点?(优化指南)
这篇文章主要探讨了如何在阿里云MaxCompute(原ODPS)平台上对SQL任务进行优化,特别是针对大数据处理和分析场景下的性能优化。
|
SQL 关系型数据库 索引
SQL优化常用方法53
分离表和索引
1330 0