大数据量的处理(向SQL2005专家提问) 可对UserID+MsgID建立复合索引,这样应该能提高速度. 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 潇洒老乌龟(爱新觉罗.毓华)可对UserID+MsgID建立复合索引,这样应该能提高速度.谢谢,但这样下去不是办法。你们想想看有没有更好的处理方法。 如此大的数据量进行的查询,更新或其他操作,个人建议你转用oracle.至于sql server,不知道有什么更好的方法了.(试试你将数据按日期或地区或其他内容分表行不行?) 公司现没有空的服务器,烦人啊。 曾经也想试过把UserID分表建,但这样的整个系统代码量改造惊人,所以该方法基础上不会考虑。 sql2005自带的分组分区建表,可能会好点代码改造不大. 上述表结构的建立对于应用代码应该不需要大的改造,可以很好的提高日常操作的性能。对于历史查询,还是建议用数据仓库,如果不想用数据仓库,对于一般的查询还可以在夜间(你的业务应该有夜间空闲时间吧)建立面向userid和MSGID的各类查询统计冗余表,用于统计查询。如果要查明细,只有加索引并严格限定查询的条件。 公司现没有空的服务器,烦人啊。 曾经也想试过把UserID分表建,但这样的整个系统代码量改造惊人,所以该方法基础上不会考虑。------------------------------------------------通过分区视图是不需要改造应用代码的,只是需要很多的服务器,并且分区视图需要经验,做的不好也可能达不到效果。 看LZ的这3张表的定义,觉得效率不是很高:CREATE TABLE [dbo].[Net_User]( [AutoID] [bigint] IDENTITY(1,1) NOT NULL, [UserID] [varchar](12) COLLATE Chinese_PRC_CI_AS NULL, [IF1] [bigint] NULL, [IF2] [bigint] NULL, [MsgID] [bigint] NULL, ) ON [PRIMARY] 1) UserID的定义可以使用int型,然后有另外一张表存放字符类型的UserID,对int型的操作要比varchar快2)所有的表都是bigint,可以考虑一下是否真的必要,int在多数情况下是足够的。 建议LZ查联机文档比较一下int和bigint的范围,bigint比int大了整整一倍。每天20万记录,10年的记录有 200,000 x 365 x 10 = 7.3 亿记录int 的最大范围是21亿,可以用接近30年,30年后再换成 bigint 都来得及。 :)前几天我试过在表三(Net_Log)改为UserID唯一的记录。多个MsgID(改为varchar(max)类型)用“,”(如:MsgID=',12,13,14,15,')分串在一起,处理速度也没有现有的快。 -------------------------------------------这个办法不好,不能用到索引只会更慢用XML也不好,操作XML也很慢有一个倒出历史数据库的策略就可以了,比如历史数据表里面只保存最近2年的数据,其他的备份保存起来。 可以用sql 2005的分区表 分表,没什么好说的.并且每个表一个文件.如:表: DAT_200801 = > DAT_200801.NDF统计用过程去统计.如 DAT_200801,DAT_200802,DAT_200803 ..... 每个月数据定到对应的表中.注意建立相应的主键.历史数据一定要整理一遍. 表 => 设计 => 设置到的文件组.然后 数据库 => 属性.删除相应的旧文件.过程里按时间统计相应的表.如 2008/1/1到 2008/5/30,则在 DAT_200801 到 DAT_200805 中统计.用过程一个一个地统计.千成不要生成临时视图一类的. 本人采用“sql 2005的分区表”谢谢 ---ojuju10 输过字符的单元格,如果让它恢复null 数据库设计,邮件这个表如何设计? sql in语句困惑 怎么装了sp4后还出现"error extablishing socket". 添加序号 求大家帮忙!!非常感谢。很急,在线等。。 关于cast/decimal 关于数据库加密 连续追加用户权限问题 关于Delphi中使用BDE连接SQL Server的问题? 请大家帮忙推荐一本关于数据库开发的书 关于MYSQL左连接的一个问题
可对UserID+MsgID建立复合索引,这样应该能提高速度.
谢谢,但这样下去不是办法。
你们想想看有没有更好的处理方法。
个人建议你转用oracle.至于sql server,不知道有什么更好的方法了.
(试试你将数据按日期或地区或其他内容分表行不行?)
曾经也想试过把UserID分表建,但这样的整个系统代码量改造惊人,所以该方法基础上不会考虑。
对于历史查询,还是建议用数据仓库,如果不想用数据仓库,
对于一般的查询还可以在夜间(你的业务应该有夜间空闲时间吧)建立面向userid和MSGID的各类查询统计冗余表,用于统计查询。
如果要查明细,只有加索引并严格限定查询的条件。
曾经也想试过把UserID分表建,但这样的整个系统代码量改造惊人,所以该方法基础上不会考虑。------------------------------------------------
通过分区视图是不需要改造应用代码的,只是需要很多的服务器,并且分区视图需要经验,做的不好也可能达不到效果。
[AutoID] [bigint] IDENTITY(1,1) NOT NULL,
[UserID] [varchar](12) COLLATE Chinese_PRC_CI_AS NULL,
[IF1] [bigint] NULL,
[IF2] [bigint] NULL,
[MsgID] [bigint] NULL,
) ON [PRIMARY] 1) UserID的定义可以使用int型,然后有另外一张表存放字符类型的UserID,对int型的操作要比varchar快
2)所有的表都是bigint,可以考虑一下是否真的必要,int在多数情况下是足够的。
建议LZ查联机文档比较一下int和bigint的范围,bigint比int大了整整一倍。每天20万记录,10年的记录有 200,000 x 365 x 10 = 7.3 亿记录
int 的最大范围是21亿,可以用接近30年,30年后再换成 bigint 都来得及。 :)前几天我试过在表三(Net_Log)改为UserID唯一的记录。多个MsgID(改为varchar(max)类型)用“,”(如:MsgID=',12,13,14,15,')分串在一起,处理速度也没有现有的快。
-------------------------------------------
这个办法不好,不能用到索引只会更慢用XML也不好,操作XML也很慢有一个倒出历史数据库的策略就可以了,比如历史数据表里面只保存最近2年的数据,其他的备份保存起来。
可以用sql 2005的分区表
统计用过程去统计.
如 DAT_200801,DAT_200802,DAT_200803 .....
每个月数据定到对应的表中.注意建立相应的主键.
历史数据一定要整理一遍. 表 => 设计 => 设置到的文件组.然后 数据库 => 属性.删除相应的旧文件.
过程里按时间统计相应的表.如 2008/1/1到 2008/5/30,则在 DAT_200801 到 DAT_200805 中统计.
用过程一个一个地统计.千成不要生成临时视图一类的.