新足迹

 找回密码
 注册

精华好帖回顾

· 美食接龙活动助兴甜品 (2010-4-14) 大胃 · 啊! 南极!---24天南极之旅归来汇报 (2015-7-30) sinkai
· 9月美食活动——老婆の饼 (2009-9-5) edith921 · 迈向皮鞋,我的广州-悉尼搬家经历 (2015-3-19) fangray
Advertisement
Advertisement
查看: 7182|回复: 103

一个table,25亿条记录,每天要更新,最快的方法? [复制链接]

退役斑竹

发表于 2013-4-10 10:42 |显示全部楼层
此文章由 月亮 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 月亮 所有!转贴必须注明作者、出处和本声明,并保持内容完整
有个一个table,有25亿条记录并且在不断增长中,每天要从PRODUCTION数据库copy到DW的数据库,目前的操作是每次truncate table,然后SSIS传输,有木有更快的办法?

用的是SQL 2008
Advertisement
Advertisement

发表于 2013-4-10 11:09 |显示全部楼层
此文章由 Fernando 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 Fernando 所有!转贴必须注明作者、出处和本声明,并保持内容完整
如果是Oracle就好说,呵呵
SQL 2008 应该也很强大了,办法应该很多吧

发表于 2013-4-10 11:11 来自手机 |显示全部楼层
此文章由 huaxianz 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 huaxianz 所有!转贴必须注明作者、出处和本声明,并保持内容完整
不是太清楚问题
不过一般可以用CDC,partitioning
25亿条一般来说绝对算大了,不过更要看width,总体的size更能说明问题

退役斑竹

发表于 2013-4-10 11:33 |显示全部楼层
此文章由 月亮 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 月亮 所有!转贴必须注明作者、出处和本声明,并保持内容完整
huaxianz 发表于 2013-4-10 10:11
不是太清楚问题
不过一般可以用CDC,partitioning
25亿条一般来说绝对算大了,不过更要看width,总体的size更 ...

column倒不是很多,总共size是230GB,加上Index的话是500GB

退役斑竹

发表于 2013-4-10 11:35 |显示全部楼层
此文章由 月亮 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 月亮 所有!转贴必须注明作者、出处和本声明,并保持内容完整
Fernando 发表于 2013-4-10 10:09
如果是Oracle就好说,呵呵
SQL 2008 应该也很强大了,办法应该很多吧

方法应该是不少,但要最快的。

用Merge Into快,还是Truncate了全部重来快?

表太大,捣腾一遍一天就没了,伤不起

发表于 2013-4-10 11:35 |显示全部楼层
此文章由 porcorosso 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 porcorosso 所有!转贴必须注明作者、出处和本声明,并保持内容完整
月亮 发表于 2013-4-10 10:33
column倒不是很多,总共size是230GB,加上Index的话是500GB

减少用index速度会加快

index25亿条记录太吃力了,每次insert都得gothru它们
Advertisement
Advertisement

退役斑竹

发表于 2013-4-10 11:37 |显示全部楼层
此文章由 月亮 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 月亮 所有!转贴必须注明作者、出处和本声明,并保持内容完整
porcorosso 发表于 2013-4-10 10:35
减少用index速度会加快

index25亿条记录太吃力了,每次insert都得gothru它们

但如果传过去之后再加index,还是费时间的。

这么大的表不index随便运行个report都要等死

发表于 2013-4-10 12:33 |显示全部楼层
此文章由 Fernando 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 Fernando 所有!转贴必须注明作者、出处和本声明,并保持内容完整
每次25亿条记录都是新的? 只要把更新的一部分数据传过去就可以了吧,能有多少%?

发表于 2013-4-10 12:39 |显示全部楼层
此文章由 典 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 典 所有!转贴必须注明作者、出处和本声明,并保持内容完整
Replication不行吗,是不是copy的时候要处理?
头像被屏蔽

禁止发言

发表于 2013-4-10 12:39 |显示全部楼层
此文章由 dbsdsuna 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 dbsdsuna 所有!转贴必须注明作者、出处和本声明,并保持内容完整
把这个表对应的文件找出来,直接拷文件如何?

发表于 2013-4-10 12:46 |显示全部楼层
此文章由 典 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 典 所有!转贴必须注明作者、出处和本声明,并保持内容完整
我知道有人是给每条record加标记,比如1表示已经传给DW了
如果一条record被update,就把标记去掉

每天给DW传数据的时候先看标记
传完后再加上标记


这个方法可行但不是特别好
职业灌水赚分
Advertisement
Advertisement

发表于 2013-4-10 12:55 |显示全部楼层
此文章由 北风 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 北风 所有!转贴必须注明作者、出处和本声明,并保持内容完整
不要用insert into

这样,log会少很多
1. drop table
2. select into
3. create constrains, indexes...

特殊贡献奖章

发表于 2013-4-10 12:56 |显示全部楼层
此文章由 kr2000 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 kr2000 所有!转贴必须注明作者、出处和本声明,并保持内容完整
25亿!
膜拜

发表于 2013-4-10 13:03 |显示全部楼层
此文章由 北风 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 北风 所有!转贴必须注明作者、出处和本声明,并保持内容完整
北风 发表于 2013-4-10 11:55
不要用insert into

这样,log会少很多

我的经验是其他的truncate, insert; insert only都不会比这个方法快的
你可以拿1千万的record先试验
If you let people believe that you are weak, sooner or later you’re going to have to kill them.

退役斑竹

发表于 2013-4-10 13:04 |显示全部楼层
此文章由 月亮 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 月亮 所有!转贴必须注明作者、出处和本声明,并保持内容完整
典 发表于 2013-4-10 11:39
Replication不行吗,是不是copy的时候要处理?

replication一个table?

退役斑竹

发表于 2013-4-10 13:05 |显示全部楼层
此文章由 月亮 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 月亮 所有!转贴必须注明作者、出处和本声明,并保持内容完整
Fernando 发表于 2013-4-10 11:33
每次25亿条记录都是新的? 只要把更新的一部分数据传过去就可以了吧,能有多少%? ...

用merge into也很慢。。。慢死人。。。死人。。。人。。。
Advertisement
Advertisement

发表于 2013-4-10 13:11 |显示全部楼层
此文章由 stevenbian 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 stevenbian 所有!转贴必须注明作者、出处和本声明,并保持内容完整
传以前把目标表的主键外键索引各种约束统统去掉,传完再加回来。

退役斑竹

发表于 2013-4-10 13:14 |显示全部楼层
此文章由 月亮 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 月亮 所有!转贴必须注明作者、出处和本声明,并保持内容完整
stevenbian 发表于 2013-4-10 12:11
传以前把目标表的主键外键索引各种约束统统去掉,传完再加回来。

木有约束,除了一个IDENTITY外,啥都木有

发表于 2013-4-10 13:17 |显示全部楼层
此文章由 dayang 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 dayang 所有!转贴必须注明作者、出处和本声明,并保持内容完整
wow, 一个500GB的table.

膜拜

2010年度奖章获得者

发表于 2013-4-10 13:24 |显示全部楼层
此文章由 dalaohu 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 dalaohu 所有!转贴必须注明作者、出处和本声明,并保持内容完整
才半个T,还早,呵呵

退役斑竹

发表于 2013-4-10 13:25 |显示全部楼层
此文章由 月亮 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 月亮 所有!转贴必须注明作者、出处和本声明,并保持内容完整
北风 发表于 2013-4-10 11:55
不要用insert into

这样,log会少很多

每次都drop table? 有啥理论根据?
Advertisement
Advertisement

发表于 2013-4-10 13:29 |显示全部楼层
此文章由 北风 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 北风 所有!转贴必须注明作者、出处和本声明,并保持内容完整
月亮 发表于 2013-4-10 12:25
每次都drop table? 有啥理论根据?

select into不会写到transaction log
而insert into会,这会造成很大的区别
你试一下就知道了
If you let people believe that you are weak, sooner or later you’re going to have to kill them.

发表于 2013-4-10 13:30 |显示全部楼层
此文章由 典 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 典 所有!转贴必须注明作者、出处和本声明,并保持内容完整
还有个办法是做partition, 如果能找到规律,把铁定不会被更改的记录放一个或几个partition里,这样每次只需处理部分数据

或者干脆分成几个表,如果有规律可循

Replication一个表当然可以,等于把这个表身上当天发生的log传过去。
职业灌水赚分

发表于 2013-4-10 13:34 |显示全部楼层
此文章由 Fernando 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 Fernando 所有!转贴必须注明作者、出处和本声明,并保持内容完整
月亮 发表于 2013-4-10 12:05
用merge into也很慢。。。慢死人。。。死人。。。人。。。

merge 肯定要读整个表的

oracle的materialized view可以只refresh 数据变化的部分。 在后台就是trigger来实现的。所有的insert,update, delete都trigger一个transaction复制数据,overhead很小。 Sql Server 自己有BI,ETL这块应该也有现成的功能吧。

前面那个朋友说把数据文件copy过去,这个可以吗?把这个大表放在一个单独的数据文件里,用备份恢复的方式copy
like hell

退役斑竹

发表于 2013-4-10 13:35 |显示全部楼层
此文章由 月亮 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 月亮 所有!转贴必须注明作者、出处和本声明,并保持内容完整
典 发表于 2013-4-10 12:30
还有个办法是做partition, 如果能找到规律,把铁定不会被更改的记录放一个或几个partition里,这样每次只需 ...

问了一下IT,他们不同意做Replication,目前只有Mirror

发表于 2013-4-10 13:38 |显示全部楼层
此文章由 chinara 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 chinara 所有!转贴必须注明作者、出处和本声明,并保持内容完整
25 亿都是新数据?没有时间column? 有什么column 可以分区吗?不能高级复制?改点传点儿?

能每晚磁盘镜像然后在另外一台机器重建report 或DW 实例吗?

不熟SQL Server,进来学习的。开始对SQL Server 膜拜了。
Advertisement
Advertisement

退役斑竹

发表于 2013-4-10 13:40 |显示全部楼层
此文章由 月亮 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 月亮 所有!转贴必须注明作者、出处和本声明,并保持内容完整
chinara 发表于 2013-4-10 12:38
25 亿都是新数据?没有时间column? 有什么column 可以分区吗?不能高级复制?改点传点儿?

能每晚磁盘镜像 ...

大部分不是新的,但会更改,主要是想找到最快的方法

发表于 2013-4-10 13:44 |显示全部楼层
此文章由 典 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 典 所有!转贴必须注明作者、出处和本声明,并保持内容完整
Fernando 发表于 2013-4-10 12:34
merge 肯定要读整个表的

oracle的materialized view可以只refresh 数据变化的部分。 在后台就是trigger ...

这个Trigger Sql也有
跟前面提到的flag思路差不多
如果任何修改增加,就用trigger标记一下表示这条记录需要传送,当然也可以象你说的把记录复制一份
职业灌水赚分

退役斑竹 2007 年度奖章获得者 2008年度奖章获得者 特殊贡献奖章 参与宝库编辑功臣

发表于 2013-4-10 14:17 |显示全部楼层
此文章由 黑山老妖 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 黑山老妖 所有!转贴必须注明作者、出处和本声明,并保持内容完整
要快就一定要避免transaction log。
Drop table 肯定比truncate table 快。
都这样大的数据库还用微软。。。
上oracle 啦。

发表于 2013-4-10 14:25 |显示全部楼层
此文章由 stevenbian 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 stevenbian 所有!转贴必须注明作者、出处和本声明,并保持内容完整
貌似微软的DW和excel整合的比较好,oracle的DW不知道现在改成啥样了。

发表回复

您需要登录后才可以回帖 登录 | 注册

本版积分规则

Advertisement
Advertisement
返回顶部