SQL查询调整/优化

时间:2019-01-05 15:03:40

标签: sql

对于大量数据,要花费大量时间来执行。

请帮助调整此查询。

select * 
from 
    (select cs.sch, cs.cls, cs.std, d.date, d.count
     from 
         (select c.sch, c.cls, s.std
          from 
              (select distinct sch, cls from Data) c  --List of school/classes
          cross join 
              (select distinct std from Data) s --list of std
         ) cs  --every possible combination of school/classes and std
     left outer join 
         Data D on D.sch = cs.sch and D.cls = cs.cls and D.std = cs.std  --try and join to the original data
     group by 
         c.sch, c.cls, s.std, d.date, d.count) 
order by 
    cs.sch, cs.cls, 
    case 
       when (cs.std= 'Ax')
          then 1
       when (cs.std= 'Bo') 
          then 2
       when (cs.std= 'Ct') 
          then 3
       else null
    end

预先感谢

Magickk

2 个答案:

答案 0 :(得分:2)

首先,查询会生成很多行(大概是这样),因此将花费时间。

据我所知,外部聚合不是必需的。至少,您没有可疑的聚合功能。

select c.sch, c.cls, s.std, d.date, d.count
from (Select distinct sch, cls from Data
     ) c cross join    -- list of school/classes
     (select distinct std from Data
     ) s left join     -- list of std
     Data d
     on d.sch = cs.sch and d.cls = cs.cls and d.std = cs.std 
 order by cs.sch, cs.cls, 
          (case cs.std when 'Ax' then 1 when 'Bo' then 2 when 'Ct' else 3 end)

对于外部order by,您无能为力。对于select distinct子查询,可以在data(sch, cls, std)(第三列是join)和data(std)上创建索引。

答案 1 :(得分:0)

DISTINCT正在减慢大表的性能。相反,可以将DISTINCT替换为GROUP BY(在某些情况下此方法更为快捷)

select * 
from 
(select cs.sch, cs.cls, cs.std, d.date, d.count
from 
(select c.sch, c.cls, s.std
 from 
(select sch, cls  from Data
group by sch, cls) c
cross join
(select std from Data
group by std) s) cs  --every possible combination of school/classes and std
 left outer join 
Data D on D.sch = cs.sch and D.cls = cs.cls and D.std = cs.std  --try and join to the original data
 group by 
     c.sch, c.cls, s.std, d.date, d.count) 
order by 
cs.sch, cs.cls, 
case 
   when (cs.std= 'Ax')
      then 1
   when (cs.std= 'Bo') 
      then 2
   when (cs.std= 'Ct')