暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

Sql优化实战

奔跑的小梁 2023-02-27
379
  • 涉及的表

    • TRANSACTIONS

    • 表字段

      • TRANSACTION_ID唯一键

      • transaction_type记录类型 TRANSACTION_TYPE

      • TRANID订单号

      • CREATE_DATE创建时间

    • TRANSACTION_LINK

    • 表字段

      • APPLIED_TRANSACTION_ID 子记录订单号,取自TRANSACTIONS表的TRANSACTION_ID

      • ORIGINAL_TRANSACTION_ID 父记录订单号,取自TRANSACTIONS表的TRANSACTION_ID

  • 说明: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+]


    • 优化后的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毫秒]:

      • 优化思路

        • where条件往前提,把主表的记录数降低

        • or查询条件可以转化为union联合查询


      文章转载自奔跑的小梁,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

      评论