锁定老帖子 主题:上亿数据的查询插入速度如何提升
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
|
|
---|---|
作者 | 正文 |
发表时间:2013-03-11
我觉得tfwin2说的很清楚啊,先确诊了才好开方啊!
|
|
返回顶楼 | |
发表时间:2013-03-11
建议
1 b表按月分区 2 迁移数据用ddl :create table b as ...select from a |
|
返回顶楼 | |
发表时间:2013-03-11
换更好的机器或者硬件设备
|
|
返回顶楼 | |
发表时间:2013-03-11
建议你把B表按年月分表
如 B_2012_1、B_2012_2 在写个存储过程按月生成表 以前开发也遇到这种问题,不过我设计时考虑的多了些,按年生成表,速度还可以 |
|
返回顶楼 | |
发表时间:2013-03-11
把B表按年月分表
|
|
返回顶楼 | |
发表时间:2013-03-11
zhurutang 写道 tfwin2 写道 根据描述,觉得不是你A表统计语句的问题。
是B表插入的问题。 B表如果有索引或唯一性验证,那么插入越来越慢是肯定的。 你可以做个简单的测试,比如24条SQL,建24个表,执行插入,看看具体效率。 如果24张表速度都是平均,那么就是插入问题。 如果24张表速度都很慢,那么是A表查询问题。 如果有慢有快,才是表空间一类的问题。 非常谢谢tfwin2的热心解答,我明天回公司试试。如果还有朋友有其他见解,请发表出来,我们可以相互学习 如果B表是有索引的,建议先去掉索引,等数据全部插入后再加索引。 |
|
返回顶楼 | |
发表时间:2013-03-11
1. 先搞清楚是select慢,还是insert慢,
2. B表上不要建index,insert完再建index |
|
返回顶楼 | |
发表时间:2013-03-12
骠骑大将军 写道 1. 先搞清楚是select慢,还是insert慢,
2. B表上不要建index,insert完再建index 嗯 可以先看一下oracle执行计划 |
|
返回顶楼 | |
发表时间:2013-04-07
参考下面的伪代码,写存储过程或者客户端程序。这种方式不需要缓存中间结果,还可以自己控制批量更新的数量,在同样的优化条件下,应该比sql语句效率高。
curMonth=NULL; curRecordCount = 0; curArea=NULL; curProduct=NULL; totalSaleCount = 0.0; totalSaleAmount = 0.0; updateCount = 0; select date,area,product,unitprice,salecount from A order by date,area,product while(fetch_next()) { if(monthOf(date)!=curMonth || area!=curArea || product!=curProduct) { if(curRecordCount>0) { insert B values(curMonth,curArea,curProduct,totalSaleCount,totalSaleAmonnt,...) updateCount++; if(updateCount>=1000) { commit; updateCount=0; } } curMonth=monthOf(date); curRecordCount=0; curArea = area; curProduct=product; totalSaleCount=0.0; totalSaleAmount=0.0; } curRecordCount++; totalSaleCount += salecount; totalSaleAmount += salecount*unitprice; } if(curRecordCount>0) { insert B values(curMonth,curArea,curProduct,totalSaleCount,totalSaleAmonnt,...) updateCount++; } if(updateCount>0) commit; |
|
返回顶楼 | |