首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 数据库 > SQL Server >

研究怎么最快操作数据insert update delete

2012-03-08 
研究如何最快操作数据insert update delete前两天在做模拟数据,想模拟10000000条记录。写了个winform程序,

研究如何最快操作数据insert update delete
前两天在做模拟数据,想模拟10000000条记录。写了个winform程序,记过发现每秒钟最多处理插入300条记录。我记得以前做批量update每秒貌似上千吧。

于是研究下如果想提升到更高,需要怎么做。随便想了个场景。比如大型网游。有无数个玩家在操作。每秒假设有1W条记录产生,然后需要存入数据库。如何做呢。注意,每秒1W不带停的产生。数据每秒都在做insert update delete处理操作。

我用了存储在做insert的时候最多才300条每秒,很郁闷。所以看看大家有啥精辟的方法

[解决办法]

探讨
看不懂楼上的意思噢。
举个例子比如在线的同时1W个玩家击毙了一个怪物。同时1W个玩家的经验值会增加吧。或者服务器刚开服,瞬间10W用户注册进来。

[解决办法]
1:如果模拟数据,不要用winform插入,最好有现成的数据导入,如果没有,在sql里面用语句生成。(lz用存储过程都慢,看来机器性能或是数据库性能有问题)
2:大型网游人物角色的信息基本是存储在文件中的(比如身上物品段数),只有关系信息(比如帮派)存储在战区数据库中(一般mysql).帐户信息存储在主数据库中(mssql,oracle等)

[解决办法]
不要把所有东西压在数据库身上。对于一个大型的应用,缓存方案、分布式方案,高可用性方案,异步操作……都很重要
比如一个大型游戏,他的接入服务器有n台,有各自缓存,只有必须的数据在不同服务器间同步,事实上,同样的数据可能有多份, 要永久保存的东西,才异步操作数据库,当然数据库服务器可能是一个集群。
[解决办法]
数据库只是记录数据而已,但是数据也不一定要实时的存到磁盘上,通常服务器会利用内存来缓存一些数据,成批的存入数据会比单条递交平均存储时间要少的多,所以,应用服务器用内存缓存一些数据+数据库会利用一些缓存+磁盘阵列硬件上的缓存+磁盘阵列是多块盘同时工作,同时分担I/O的,所以楼主的设想的突发状态服务器还是可以应付的
但是,长时间如此负荷就不行了。
[解决办法]
探讨
索引是肯定有的啊。我连日志都简单了。但是说貌似有索引插的就是慢

[解决办法]
高性能服务器
数据缓存,分布式事务
--
具体操作,要开贴一千才能说得清
[解决办法]
wow采用的都是刀片服务器,给你这么比喻下,刀片和你台式机的在数据吞吐方面就像一个能跑400码的跑车对比只能跑30码的电动车
[解决办法]
去跟大型游戏数据库管理员交流交流,啥都明白了
帮顶
[解决办法]
网游的服务器应该是多台数据库服务器联合组成的,并不是一台机器在处理。

还有,插入300的话,我怀疑是不是你机器的IO有问题,正常的笔记本弄个3000条/秒没什么问题的

[解决办法]
探讨
引用:
索引是肯定有的啊。我连日志都简单了。但是说貌似有索引插的就是慢

如果数据是大量的话。有索引肯定比没有索引慢

[解决办法]
这个估计需要对数据库进行分区。以前曾经做过一个实验,就是模拟想数据库中插入100W的数据,结果发现每秒也就是向数据库中插入几百条数据(当然和计算机有关系,也和表的结构,列的数据类型有关系)
[解决办法]
一.加快硬件速度.
二.表分区
三.多线程插入数据
四.利用数据库事务插入数据
...
[解决办法]
public DataSet UpdateByDataSet(DataSet ds, string strTablename)
{
SqlConnection myconn = new SqlConnection(connstr);
SqlCommand sqlcmd = new SqlCommand("select * from " + strTablename, myconn);
SqlDataAdapter myda = new SqlDataAdapter(sqlcmd);
SqlCommandBuilder mycomb = new SqlCommandBuilder(myda);
//myda.DeleteCommand = mycomb.GetDeleteCommand();
myda.InsertCommand = mycomb.GetInsertCommand();
//myda.UpdateCommand = mycomb.GetUpdateCommand();
try
{
lock (this)
{
myconn.Open();
myda.Update(ds, strTablename);
myconn.Close();
return ds;
}
}

catch (Exception ex)
{
myconn.Close();
MessageBox.Show(ex.ToString());
return ds;
}
}
试试,把数据读入dataset,然后一把子插入!我们做过你上面描述的情况的试验,不过你可以试试!


[解决办法]
楼上的方案基本是对的,但如何做这个总是怎么说呢?

如果你真的有这方面经验,你就知道了,可是如果你没有这方面的经验,三言两语
或者我写一万字出来你还是不懂。否则这一万字就可以卖十万块钱一份了,它可以把一个没有大规模应用经验的人一下子
成了大规模应用的高手,你说它能卖多少钱?

事实上也没有这样的对圣经可以做到,靠的只是慢慢的积累。而不是需要懂的时候一下子懂了。
[解决办法]
ls上的朋友们忽略了一个很重要的问题,不一定所有的操作都要在服务器执行,客户端也是一个狠重要的资源,比如一个及时且不重要的小操作 完全可以全部在客户端执行,只有涉及到和money挂钩的操作才让服务器处理,处理再完返回给客户端。

现在的网游好多操作都在客户端执行,所以才生出了N的“外挂”,要求客户端做的动作越多 ,“外挂”的空间就越大.

而服务器真正的速度瓶颈只在数据库,业务处理都相对差一些,而数据库所要做的操作只有增删改查,一般像稍微大一点的网游 增删改查,索引 基本都会做到最佳状态,所以总结出一个道理: “一个网游的速度快慢直接等于这个网游的服务器硬件!”


---------------------------------------------------------------
引用老黄的一段话

(DELL2950 +win2003+Oracle 10G)通过建立索引能够达到的性能的提高,100万的数据里面检索出其中的5-20%的时候。单位时间内的I/O性能会有2%-10%的提高.
得到的一个结论是 ,性能大部分是通过服务器硬件体现的.
---------------------------------------------------------------

热点排行