select k.*
from
(select c.acId,c.subject,c.createDate,type,d.status,e.emName,d.totalSignCount from action c
join (select a.acId,sum(a.status) as status, count(a.acId) as totalSignCount from actionEmployee a
join action b on a.acId=b.acId group by a.acId) as d on c.acId=d.acId
join employee e on e.emId=c.emId where c.emId=103
union select c.acId,c.subject,c.createDate,type,d.status,e.emName,d.totalSignCount from action c
join (select a.acId,sum(a.status) as status, count(a.acId) as totalSignCount from actionEmployee a
join action b on a.acId=b.acId group by a.acId) as d on c.acId=d.acId
join employee e on e.emId=c.emId join actionEmployee f on c.acId=f.acId and f.signEmId=103 ) as k
order by k.acId desc产生了3个tablescan,有没有办法优化一下这个语句?里面有两段都重复了 

解决方案 »

  1.   

    用case when,语句太多,建议楼主贴表结构、数据和你要多结果
      

  2.   

    select c.acId,c.subject,c.createDate,type,d.status,e.emName,d.totalSignCount from action c 
           join (select a.acId,sum(a.status) as status, count(a.acId) as totalSignCount from actionEmployee a 
           join action b on a.acId=b.acId group by a.acId) as d on c.acId=d.acId 
           join employee e on e.emId=c.emId 
      where c.emId=103 
    union all
     select c.acId,c.subject,c.createDate,type,d.status,e.emName,d.totalSignCount from action c   --怎么没有条件呢?
       join (select a.acId,sum(a.status) as status, count(a.acId) as totalSignCount from actionEmployee a 
       join action b on a.acId=b.acId group by a.acId) as d on c.acId=d.acId 
       join employee e on e.emId=c.emId join actionEmployee f on c.acId=f.acId and f.signEmId=103 
    order by f.acId desc 
      

  3.   


    重新贴一下,可以执行的select k.* 
    from 
     (select c.acId,c.subject,c.createDate,type,d.status,e.emName,d.totalSignCount from action c join (select a.acId,sum(a.status) as status, count(a.acId) as totalSignCount from actionEmployee a join action b on a.acId=b.acId group by a.acId) as d on c.acId=d.acId join employee e on e.emId=c.emId where c.emId=103 union select c.acId,c.subject,c.createDate,type,d.status,e.emName,d.totalSignCount from action c join (select a.acId,sum(a.status) as status, count(a.acId) as totalSignCount from actionEmployee a join action b on a.acId=b.acId group by a.acId) as d on c.acId=d.acId join employee e on e.emId=c.emId join actionEmployee f on c.acId=f.acId and f.signEmId=103 ) as k
    order by k.acId desc
      

  4.   


    select --distinct
    c.acId,c.subject,c.createDate,type,d.status,e.emName,d.totalSignCount 
    from action c 
    join 
    (select a.acId,sum(a.status) as status, count(a.acId) as totalSignCount 
    from actionEmployee a 
    join action b 
    on a.acId=b.acId 
    group by a.acId
    ) as d 
    on c.acId=d.acId 
    join employee e 
    on e.emId=c.emId 
    where c.emId=103 
    or exists (select 1 from actionEmployee f where c.acId = f.acId and f.signEmId=103)
    order by c.acId desc 
      

  5.   

    为什么要union 呢?signEmId都是103呀!
      

  6.   

    try:
    select 
        c.acId,c.subject,c.createDate,type,d.status,e.emName,d.totalSignCount 
    from 
        action c 
    inner join 
        (select 
             a.acId,sum(a.status) as status, count(a.acId) as totalSignCount 
         from 
             actionEmployee a 
         inner join 
             action b 
         on 
             a.acId=b.acId 
         group by 
             a.acId) as d 
    on 
        c.acId=d.acId 
    inner join 
        employee e 
    on 
        e.emId=c.emId 
    left join 
        actionEmployee f 
    on 
        c.acId=f.acId
    where
        c.emId=103 or (c.emId!=103 and f.signEmId=103)
    order by 
        c.acId desc 
      

  7.   

    select k.* 
    from  
    (select c.*,d.status,e.emName,d.totalSignCount from action c join (select a.acId,sum(a.status) as status, count(a.acId) as totalSignCount from actionEmployee a join action b on a.acId=b.acId and b.emId=103 group by a.acId) as d on c.acId=d.acId join employee e on e.emId=c.emId 
    union select c.*,d.status,e.emName,d.totalSignCount from action c join (select a.acId,sum(a.status) as status, count(a.acId) as totalSignCount from actionEmployee a join action b on a.acId=b.acId and a.signEmId=103 group by a.acId) as d on c.acId=d.acId join employee e on e.emId=c.emId ) as k 
    order by k.acId desc最后优化成这个样子,去掉了两个内连接,加了个索引,正常了,再看看大家的回复,对比一下
      

  8.   

     type字段是哪个表中的啊 ?
      

  9.   


    你这个语句查询结果和我的是一直的,至于性能,我看不明白,大家看看是用哪个好些
    duration    cpu    reads    writes   
         15     15     68     0        你的
         16     16      152     0        我的两个脚本一起执行,则执行计划你的是51.39%,我的是48.61%到底哪个效率高些?
      

  10.   

    sorry,是c.type,"c.acId,c.subject,c.createDate,type"直接改为c.*
      

  11.   


    SELECT
    status, emName, totalSignCount
    FROM
    action AS c
    INNER JOIN employee AS e 
    ON e.emId = c.emId
    INNER JOIN
    (SELECT
    a.acId, SUM(a.status) AS status, COUNT(a.acId) AS totalSignCount
    FROM actionEmployee AS a
    INNER JOIN action AS b 
    ON a.acId = b.acId 
    AND b.emId = 103
    GROUP BY a.acId
    UNION
    SELECT
    a.acId, SUM(a.status), COUNT(a.acId)
    FROM actionEmployee AS a 
    INNER JOIN action AS b
    ON a.acId = b.acId
    AND a.signEmId = 103
    GROUP BY a.acId
    ) AS k
    ON c.acId = k.acId
    ORDER BY  c.acId DESC
      

  12.   

    ls这个也执行正确
    SQL:StmtCompleted
    16 16 68 0 SQL:StmtCompleted  A
    31 31 152 0 SQL:StmtCompleted  我的
    0 0 93 0                    C