当前位置: 代码迷 >> Sql Server >> SqlServer每秒与此同时入库成千上万条数据
  详细解决方案

SqlServer每秒与此同时入库成千上万条数据

热度:92   发布时间:2016-04-24 18:35:49.0
SqlServer每秒同时入库成千上万条数据
大家好,我现在有个程序有1000个以上客户端发送数据过来,数据发送频率为每秒2次以上,我程序收到后处理 再入库。这样每秒就入库2000多次,速度就慢了,入库成了一个瓶颈。大家有什么好的解决方法 ?使用SQL池?

------解决方案--------------------
可以考虑bulk insert
------解决方案--------------------
每小时7200万,你的数据量一下子这么大?之前没有做过任何处理?貌似从来没有考虑过这是问题?


异步+分批+分服务器
------解决方案--------------------
没有怎么看明白。是大并发还是大数据还是既有大并发又是大数据量。大并发说实话sqlserver做的不老好。大数据还可以。大数据分批执行做成batch。也就是分批执行最小化写入log。这只恢复模式为大容量日志。只写入undo的log而不要redo的log。大并发事务排序。修改隔离级别!
------解决方案--------------------
正确设计,普通PC就能应付。
若无繁重的查询或其他任务的话
------解决方案--------------------
楼主可以先考虑在程序处理过程采用队列,如一个队列2W行记录,每填充2W记录就save至数据库,提交过程可以考虑采用xml方式。

如队列还是出现瓶颈,可以考虑多个服务器应用于写作用,这可能涉及到合并复制。

当然从最低层级的优化方面就是提升硬件,先找到瓶颈位置,如磁盘I/O出现瓶颈,可以考虑采用更快的硬盘或采用具有RAID系统的磁盘。
------解决方案--------------------
客户端先把数据存成文件,然后传到服务器端.

服务器端接受到文件先把文件存到磁盘上,给每个文件编上号(唯一值),然后服务器端写个service定时处理这些文件,可以一个文件 一个文件的处理. 这样的话应该就没问题了.

------解决方案--------------------
建个没有索引的表格,SqlBulkCopy批量导入
------解决方案--------------------
一天一个表格,如果需要查询索引
1.使用固态硬盘
2.只允许查询两天前得数据,给前一天的表格建索引
------解决方案--------------------
引用:
引用:引用:大家好,我现在有个程序有1000个以上客户端发送数据过来,数据发送频率为每秒2次以上,我程序收到后处理 再入库。这样每秒就入库2000多次,速度就慢了,入库成了一个瓶颈。大家有什么好的解决方法 ?使用SQL池?

                  sql

如果仅仅是纯记录的话,……


这个就只能在时效性和高效率间进行平衡了。 (基于现有硬件条件)
1、考虑提高磁盘io性能,磁盘阵列,raid 1,等等
2、考虑提高sql软件处理,异步,队列处理,写前台服务,集中提交...
3、考虑分库

综合因素比较多,没有具体操作过这么高频的,lz参考。

------解决方案--------------------
SQL SERVER对付这点吞吐量是绰绰有余的,如果发现性能更不上,那是设计问题,跟SQL SERVER本身无关。
有人说大并发sqlserver做的不好,我不知道依据的是什么测试结果,还是道听途说。
测试OLTP吞吐量的目前主要有2个标准,一个旧的标准TPC-C,一个是新的标准TPC-E。
我不知道大家有没有去看过那2个测试结果。
------解决方案--------------------
其他的不说,就一个分钟的那个checkpoint你这一分钟内的脏数据刷入硬盘的时候。你的IO几乎就不要干别的了。checkpont 可以再环境变量里设置 -k 参数加数值就是没秒钟刷入磁盘的MB数。但是你这么大数据量也许到下一分钟你的脏数据还没有写入磁盘。再说你的IO也许没有那么强壮。说不定不到10秒就会有压力就要触发checkpoint。感觉放在一个服务器上干这么多活会有压力!
------解决方案--------------------
你是什么程序?
如果是.net的话,我有个方法 ,可以批量插入
,收到的数据放在datatable里面。
 Try
            If con.State = ConnectionState.Broken OrElse con.State = ConnectionState.Closed Then
                con.Open()
            End If
            Using sqlBC As New SqlClient.SqlBulkCopy(con)
                sqlBC.BatchSize = 2
                '超时之前操作完成所允许的秒数,如果超时则事务不会提交 ,数据将回滚,所有已复制的行都会从目标表中移除
                sqlBC.BulkCopyTimeout = 60
                '设定 NotifyAfter 属性,以便在每插入10000 条数据时,呼叫相应事件。 
                sqlBC.NotifyAfter = 10000
                '  sqlBC.SqlRowsCopied += New SqlRowsCopiedEventHandler(AddressOf OnSqlRowsCopied)
                '设置要批量写入的表
                sqlBC.DestinationTableName = tablename
                '自定义的datatable和数据库的字段进行对应
                For t As Integer = 0 To dt.Columns.Count - 1
                    sqlBC.ColumnMappings.Add(dt.Columns(t).ColumnName.ToString(), dt.Columns(t).ColumnName.ToString())
                Next
                '批量写入
                sqlBC.WriteToServer(dt)
            End Using
        Catch ex As Exception

        Finally
            con.Close()
        End Try
  相关解决方案