论坛首页 综合技术论坛

上亿数据的查询插入速度如何提升

浏览 15098 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2013-03-11  
我觉得tfwin2说的很清楚啊,先确诊了才好开方啊!
0 请登录后投票
   发表时间:2013-03-11  
建议
1 b表按月分区
2 迁移数据用ddl :create table b as ...select  from a
0 请登录后投票
   发表时间:2013-03-11  
换更好的机器或者硬件设备
0 请登录后投票
   发表时间:2013-03-11  
建议你把B表按年月分表
如 B_2012_1、B_2012_2

在写个存储过程按月生成表

以前开发也遇到这种问题,不过我设计时考虑的多了些,按年生成表,速度还可以
0 请登录后投票
   发表时间:2013-03-11  
把B表按年月分表
0 请登录后投票
   发表时间:2013-03-11  
zhurutang 写道
tfwin2 写道
根据描述,觉得不是你A表统计语句的问题。
是B表插入的问题。
B表如果有索引或唯一性验证,那么插入越来越慢是肯定的。
你可以做个简单的测试,比如24条SQL,建24个表,执行插入,看看具体效率。
如果24张表速度都是平均,那么就是插入问题。
如果24张表速度都很慢,那么是A表查询问题。
如果有慢有快,才是表空间一类的问题。

非常谢谢tfwin2的热心解答,我明天回公司试试。如果还有朋友有其他见解,请发表出来,我们可以相互学习


如果B表是有索引的,建议先去掉索引,等数据全部插入后再加索引。
0 请登录后投票
   发表时间:2013-03-11  
1. 先搞清楚是select慢,还是insert慢,
2. B表上不要建index,insert完再建index
0 请登录后投票
   发表时间:2013-03-12  
骠骑大将军 写道
1. 先搞清楚是select慢,还是insert慢,
2. B表上不要建index,insert完再建index

嗯 可以先看一下oracle执行计划
0 请登录后投票
   发表时间: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;


0 请登录后投票
论坛首页 综合技术版

跳转论坛:
Global site tag (gtag.js) - Google Analytics