日期:2014-05-17  浏览次数:20451 次

求一高效插入SQL语句
现有一张表:salary
结构如下:
emp_id    salary
100       5000
100       3000
100       4000
101       2000
101       2500
102       4500
...

字段emp_id有重复。
现需要计算每个emp_id的平均salary值,并存入表avg_salary
表avg_salary的字段为:emp_id(主键,唯一),salary
存入时需要对salary的值进行降序排列

salary表有6000万行
求效率高的SQL语句
谢谢!
SQL

------解决方案--------------------
效率高的肯定是这样的:
truncate table avg_salary
insert into avg_salary
select emp_id, AVG(salary) 
from salary
group by emp_id

但是这么多数据的话没人会这么做,而是使用触发器,平均分散计算压力。
你这6000多万行数据,这么执行一次,怎么也好好几十分钟了。
------解决方案--------------------
存入时排不排序不重要,规范的做法是在你提取的时候用order by 最保险。
对于6000万的表,建议根据emp_id 范围分批次导入到avg_salary 比较靠普,比如每次1百万。


 declare @t table(emp_id int, salary money)
 insert into @t 
 select 100,5000 union all
 select 100,3000 union all
 select 100,4000 union all
 select 101,2000 union all
 select 101,2500 union all
 select 102,4500

 --insert into @avg
 select emp_id,sum(salary)/count(emp_id) avg_salary
 from @t
 --where emp_id>=100 and emp_id<100+1000000
 group by emp_id
 --order by sum(salary)/count(emp_id) avg_salary desc