insert into dskong.all_away_urs_110406select name,domain,mobile,gradefrom ( XYQ.Account as a left join URS_MOBILE.urs_mobile as b using(name,domain) )left join dskong.all_active_urs_110406 as c using(name,domain)where ( a.lastdate is NULL or a.lastdate < date_sub(date(now()), interval 3 month) )and c.name is NULL;
写了这个sql,跑了14个小时还没有跑完,无奈之心,只好kill。
事后分析一下,该sql有如下几点不妥之处:
1. 一个sql尽量只做一件事情,这样便于查看进度。
2. 一个sql只做一件事情,如果出了问题,也便于检查和恢复。
3. 更重要的是,这个sql会锁表,这样会使得其他的对该表操作的语句处于waiting状态。
4. 一些事情可以用shell来执行,虽然效率相差不会太多,但是会尽量少占用数据库资源。
5. 上面语句可以通过
cat file1 file2 file2 | sort | uniq -u
来执行。
6. 还有shell是区分大小写的,而mysql是不区分大小写的,所以一定要注意是否有duplicate key.
7. 我擦,一亿多条记录,随便执行一个sql语句都要一两个小时。如果不建立primary key则快很多,所以可以尽量不建立primary key,去重工作可以通过shell来执行。
阅读全文(2049) | 回复(0) | 编辑 | 精华
|