不在同一个表的子句中需要时间在oracle中

时间:2012-04-05 08:52:16

标签: sql oracle11g

查询就像..

select deviceid,devicename,totalbytes,'Others' as protocolgroup from (
    select d.deviceid,d.name as devicename,sum(bytes) as totalbytes from tblmainallowedtraffic_5min  b,tbldevice d
    WHERE (  B.APPID IN ('C070100126-VW717U','C018600068-GEF3O6','C045701665-9B6S1A','C026100710-36NPQE','C016801597-V1Z8IM') ) 
    and proto_group not in (select proto_group from (select proto_group,sum(bytes) from
    TBLMAINALLOWEDTRAFFIC_5MIN B WHERE (  B.APPID IN ('C070100126-VW717U','C018600068-GEF3O6','C045701665-9B6S1A',
    'C026100710-36NPQE','C016801597-V1Z8IM') ) AND "5mintime" >='04-APR-12 12.00.00.000000 AM' AND
    "5mintime" <='04-APR-12 11.59.59.000000 PM' group by proto_group order by sum(bytes) desc ) WHERE ROWNUM <=5 )
    AND B.APPID=D.APPID AND "5mintime" >='04-APR-12 12.00.00.000000 AM' AND "5mintime" <='04-APR-12 11.59.59.000000 PM' 
    GROUP BY D.APPID,D.DEVICEID,D.NAME)
    order by protocolgroup desc, totalbytes desc

在解释计划中说它......

3 - 过滤器(NOT EXISTS(不可行))

如果我用静态内部查询结果更改上述查询,输出会更快:

 select deviceid,devicename,totalbytes,'Others' as protocolgroup from (
    select d.deviceid,d.name as devicename,sum(bytes) as totalbytes from tblmainallowedtraffic_5min  b,tbldevice d
    WHERE (  B.APPID IN ('C070100126-VW717U','C018600068-GEF3O6','C045701665-9B6S1A','C026100710-36NPQE','C016801597-V1Z8IM') ) 
    and proto_group not in ('POP3','HTTP Request Response','Web','GET HTTP DATA MORE THAN 976 KB','SMTP' )
    AND B.APPID=D.APPID AND "5mintime" >='04-APR-12 12.00.00.000000 AM' AND "5mintime" <='04-APR-12 11.59.59.000000 PM' 
    GROUP BY D.APPID,D.DEVICEID,D.NAME)
    order by protocolgroup desc, totalbytes desc

所以not exists子句在同一个表上应用会产生问题。
你能对此有所了解吗?

1 个答案:

答案 0 :(得分:0)

编辑:新答案:

尝试进行反连接:

SELECT deviceid,
  devicename,
  totalbytes,
  'Others' AS protocolgroup
FROM
  (SELECT d.deviceid,
    d.name     AS devicename,
    SUM(bytes) AS totalbytes
  FROM tblmainallowedtraffic_5min b,
    tbldevice d
  LEFT OUTER JOIN 
    (SELECT proto_group
    FROM
      (SELECT proto_group,
        SUM(bytes)
       FROM TBLMAINALLOWEDTRAFFIC_5MIN B
       WHERE ( B.APPID IN ('C070100126-VW717U','C018600068-GEF3O6','C045701665-9B6S1A', 'C026100710-36NPQE','C016801597-V1Z8IM') )
         AND "5mintime"  >='04-APR-12 12.00.00.000000 AM'
         AND "5mintime"  <='04-APR-12 11.59.59.000000 PM'
       GROUP BY proto_group
       ORDER BY SUM(bytes) DESC
      )
    WHERE ROWNUM <=5
    ) e ON b.proto_group = e.proto_group
  WHERE ( B.APPID     IN ('C070100126-VW717U','C018600068-GEF3O6','C045701665-9B6S1A','C026100710-36NPQE','C016801597-V1Z8IM') )
  AND e.proto_group is null
  AND B.APPID     =D.APPID
  AND "5mintime" >='04-APR-12 12.00.00.000000 AM'
  AND "5mintime" <='04-APR-12 11.59.59.000000 PM'
  GROUP BY D.APPID,
    D.DEVICEID,
    D.NAME
  )
ORDER BY protocolgroup DESC,
  totalbytes DESC