2013-10-30 108 views
-1

我有一個35000行的表。我使用左連接來填充需要67秒加載的數據集。它影響Web應用程序的性能。請幫我找到一個解決方案。左連接查詢需要1分鐘。需要幫助優化

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); 

我在同一個表上使用左連接。我想整體計算(援助)列,其次我應該排除具有' - '值的相同計數(幫助)列。

+0

什麼DB? Oracle還是其他的東西? – SriniV

+0

Oracle數據庫 – user2935197

+0

哪張表有35000行? – SriniV

回答

0

試試這個:

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 
+0

非常感謝。 – user2935197

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 
+0

非常感謝。適用於我 – user2935197