【问题标题】:Left join query takes 1 min. Need help in optimizing [closed]左连接查询需要 1 分钟。在优化方面需要帮助[关闭]
【发布时间】:2013-10-30 10:17:53
【问题描述】:

我有一个 35000 行的表。我正在使用左连接来填充需要 67 秒才能加载的数据集。它会影响 Web 应用程序的性能。请帮助我找到解决方案。

SELECT
        SUM(NVL(t2.AFull,0)) as "AFull",
        SUM(NVL(t1.ADisplaying,0)) as "ADisplay",
        t1.name as "Name",
        t1.cname as "C Name",
        t1.START_TIME as "Start Date",
        t1.END_TIME as "End Date",
        t1.cid as "CID"
FROM
        (
         SELECT
            COUNT(aid) AS ADisplaying,
            cmp.name,
            cmp.cname,
            cd.START_TIME,
            cd.END_TIME,
            cmp.cid
         FROM
            c_delivery cd,
            count cmp
         WHERE 
            cmp.cid = cd.cid AND length(aid)>1
         GROUP BY
            cmp.name,
            cmp.cname,
            cd.START_TIME,
            cd.END_TIME,
            cmp.cid
         ) t1
LEFT JOIN
         (  
          SELECT
             COUNT(aid) as AFull,
             cmp.name,
             cmp.cname,
             cd.START_TIME,
             cd.END_TIME,
             cmp.cid
          FROM
             c_delivery cd,
             count cmp
          WHERE
             cmp.cid = cd.cid 
          GROUP BY
             cmp.name,
             cmp.cname,
             cd.START_TIME,
             cd.END_TIME,
             cmp.cid
          )t2
          on  t1.cid = t2.cid
          group by 
               t1.name,t1.cname,t1.START_TIME,t1.END_TIME,t1.cid);

我在同一张桌子上使用左连接。我想将 count(aid) 列作为一个整体,其次我应该排除相同的 count(aid) 列以获取“-”值。

【问题讨论】:

  • 什么数据库??甲骨文还是别的什么??
  • 哪个表有 35000 行?
  • 由于表 t1 和 t2 是相同的例外,是 t1 上的附加条件,因此左外连接没有用处。什么是 t2,你从哪里得到 t2.Afull?不要发布不正确的查询
  • SUM(NVL(t2.AFull,0)) as "AFull" -- 这个Afull是哪里来的??
  • 你可以使用类似 "sum(case when aid='-' then 1 else 0 end)" 来进行条件计数;无需连接。

标签: sql performance oracle database-performance


【解决方案1】:

试试:

select sum(case when length(aid) > 1 then 1 else 0 end) "AFull",
       count(aid) as "ADisplay",
       cmp.name "Name",
       cmp.cname "C Name",
       cd.START_TIME "Start Date",
       cd.END_TIME "End Date",
       cmp.cid "CID"
from c_delivery cd
join count cmp on cmp.cid = cd.cid
GROUP BY cmp.name, cmp.cname, cd.START_TIME, cd.END_TIME, cmp.cid

【讨论】:

  • 非常感谢。为我工作
【解决方案2】:

试试这个:

SELECT
      SUM ( COUNT ( * ) ) AS "AFull",
      SUM ( COUNT ( CASE
                    WHEN CHECK > 1
                    THEN
                        1
                    ELSE
                        0
                END ) )
          AS "ADisplay",
      NAME AS "Name",
      CNAME AS "C Name",
      START_TIME AS "Start Date",
      END_TIME AS "End Date",
      CID AS "CID"
FROM
      (SELECT
            NAME,
            CNAME,
            START_TIME,
            END_TIME,
            CID,
            LENGTH ( AID ) AS CHECK
       FROM
            C_DELIVERY CD,
            COUNT CMP
       WHERE
            CMP.CID = CD.CID)
GROUP BY
      CMP.NAME,
      CMP.CNAME,
      CD.START_TIME,
      CD.END_TIME,
      CMP.CID

【讨论】:

    猜你喜欢
    • 2021-08-26
    • 2014-08-03
    • 2012-06-18
    • 2012-04-09
    • 1970-01-01
    • 2011-07-02
    • 2016-02-16
    相关资源
    最近更新 更多