一张表既要读快,又要写快,可怎么实现啊?

small_tu 2012-09-11 04:45:22
加精
我有一张表,目前大约800W数据吧。字段不是很多,6个。
现在要持续的修改这个表,存储过程中如果有先删除,在写入新时间的记录。判断是否存在的条件是账号account。

还有一个过程在不停的读取,取的时候条件是根据账号的状态这个字段为条件,正常还是不正常。

我建立了聚集索引在账号上,普通索引在状态上。

数据量还在不停的增长。现在写入一条慢的时候要1S多,写的过程太长,使得读的过程时间也加长,我应该怎么处理下呢?

...全文
5591 146 打赏 收藏 转发到动态 举报
写回复
用AI写文章
146 条回复
切换为时间正序
请发表友善的回复…
发表回复
无聊找乐 2013-02-08
  • 打赏
  • 举报
回复
引用 145 楼 small_tu 的回复:
再说下我现在的业务逻辑吧,希望路过的人也支个招: 有一程序,在白天需要不停地往A库写入数据,然后需要将这些数据里符合某些条件的数据进行处理,写入另一个数据库B。最终的目的是要程序写入的数据尽快的写到B库 我现在用的方式是:写入A库一个表,然后用另一程序不停地来查询符合条件的记录,取到后,进行处理,然后写入B库,写入成功的,更新A库里对应的记录,使之不符合查询……
不知道你的问题现在解决没。 如果是要我来设计的话,我会建立个A1表接受客户端写入的数据,然后写个job(Oralce是这么叫的,sqlserver不知道叫什么),定时处理A1里的数据把符合某些条件的数据处理后写入到另一个数据库B,然后把A1表中扫描检查过得数据都删除掉。其实A1在这里相当于就是个缓存了。 如果说A1表中的数据不能删除的话就再建个A2表,把A1中处理过的数据搬移到A2表中就好了。
small_tu 2012-12-08
  • 打赏
  • 举报
回复
再说下我现在的业务逻辑吧,希望路过的人也支个招: 有一程序,在白天需要不停地往A库写入数据,然后需要将这些数据里符合某些条件的数据进行处理,写入另一个数据库B。最终的目的是要程序写入的数据尽快的写到B库 我现在用的方式是:写入A库一个表,然后用另一程序不停地来查询符合条件的记录,取到后,进行处理,然后写入B库,写入成功的,更新A库里对应的记录,使之不符合查询条件。 所以就出现了一个表既要查询又要写入。 有人给我支招:直接写B库,那样不行的,这个就不用说了。
small_tu 2012-12-08
  • 打赏
  • 举报
回复
该问题拖了好久了,目前也没有真正的解决。 现在将A和B两个数据库分放在了两个服务器上,(原来程序,两个数据库都放在一起),数据库的结构没做太大的修改,A数据库建立了一个临时表,存放当天的数据,晚上同步更新到总表。B数据库的查询重建了索引,也增加了一个表,现在基本上能应付现在的情况,但是由于没有从根本上解决,早晚有一天还是会出问题。 现在看到A数据库还是会出堵塞的情况,一般在几百毫秒。就是因为一个表,两个进程在操作,一个写入,一个读取然后再写入。在sql2000里我是不知道怎么从数据库自身设置了,只能从业务逻辑上思考,看看怎么修改这种方式吧。。 谢谢各位了。
湘_老胡 2012-11-16
  • 打赏
  • 举报
回复
学习,不知道问题解决了没有?
hff0991 2012-11-15
  • 打赏
  • 举报
回复
好多的高手啊
xyc880813 2012-10-24
  • 打赏
  • 举报
回复
嗨,同一张表
1.拆入的快,读取就慢
2.读取的快,插入就慢
这基本是不可调和的矛盾,在08中,引用了行版本控制,并且将隔离级别设为RCSI(读提交快照隔离)后,可以稍微缓解由于读取器(reader)和编写器(writer)之间的矛盾,但是也仅仅是,在最理想的前提下,读取器和查询器互不阻塞,何况您用2000,也更没戏。
所以目前我建议您首先观察在这个表上产生的锁的情况,定位阻塞的原因,而不是让我们在这乱猜,不过正式生产环境,观测难度较高,那么就只能凭经验来判断了
但是我觉得,如果可以升级到08或者12,这个问题可以有一个workaround的环境,在2000上,如果您还是坚持1张表,我确实想不出什么办法了,还请各位高人继续补充
情殇无限 2012-10-23
  • 打赏
  • 举报
回复
感觉大家都是在猜测。。。。插入慢,先定位是什么原因造成的,内存太小,硬盘太慢,数据库日志文件和数据文件放在一个盘上,阻塞,还是因为服务器上有其它程序的影响?定位了问题再去解决
j361764406 2012-09-28
  • 打赏
  • 举报
回复
读取时不使用锁,with(nolock), 有可能脏数据
晓风斜阳 2012-09-25
  • 打赏
  • 举报
回复
复合索引
星火燎猿 2012-09-24
  • 打赏
  • 举报
回复
数据同步,一台数据库负责读,一个数据库负责写
skyeg 2012-09-24
  • 打赏
  • 举报
回复
前面大侠们都说过了,增删操作比较频繁,建立聚集索引只会使速度更慢
星火燎猿 2012-09-24
  • 打赏
  • 举报
回复
没有猜错的话,楼主是做实时数据监控的...
gongjian0628 2012-09-24
  • 打赏
  • 举报
回复
那就采用读写分离吧
small_tu 2012-09-24
  • 打赏
  • 举报
回复
真心的感谢各位的回复,这两天生病了,所以没及时尝试大家的建议。


总结大家的建议:
分区分表--- 因为是sql2000,分区不太会做,暂时还没试,不过我会好好学习一下的。
----------------------------------------------------------
分表的话,目前想到的只能是根据区域,因为不同的用户会属于不同的区域,现在系统里大致有90个区域,所以肯定不能一个区域一个表,只能是按更上一层的条件,比如说东南西北中几个方向?不过有些用户是区域不明确的,需要单独作为一个区域不明的。
用户还会从一个区域迁移到另一个区域,这个时候只会传用户当前新的区域过来,我应该怎么处理?不会所有的表都要过一遍吧?因为我要删除用户旧的记录。
那就要在建一个表,表明用户当前和区域分表的关系,每次写入区域表的时候,先从这个表里查一下,然后在决定写那个具体的表?
----------------------------------------------
动态修改索引--几百万数据,改一次索引的时间也不短吧,我现在手动改的时候,都得请示半天才能动

----------------------------------------------
读写分离,实时同步,---怎么实时同步?我知道数据库自身的发布和订阅,但是同步时间单位最小为1分钟,这个同步的频率我这里接受不了。

-----------------------------------
使用缓存---这个我不知道各位所说的缓存怎么个实现方法?因为我真的不知道哪些数据是常用的,数据操作的机会是均等的,把哪些放入缓存合适?

------------------------------------------
再次真心感谢对这个帖子关注的您!!


liutangge 2012-09-24
  • 打赏
  • 举报
回复
精神上鼓励下你,希望你再接再厉,攻克难题!
a2325145 2012-09-24
  • 打赏
  • 举报
回复
还没有结贴了啊
xiaocongzhi 2012-09-23
  • 打赏
  • 举报
回复
分区或者分离部分数据出去
kylerrrrrrr 2012-09-22
  • 打赏
  • 举报
回复
表示晕。。。
LAONINGA098 2012-09-22
  • 打赏
  • 举报
回复
关注解决办法
hehe741852 2012-09-22
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 的回复:]

引用 1 楼 的回复:
其实要同时实现写入和读取都快是不现实的,不过一般会以查询为主,因为除insert外,其他修改语句都要先select出来再处理,只要不是大容量写入,那么就先以select为重点。我认为你800万数据中,频繁使用的数据大概10分之一左右,如果是这样,你要考虑把不长使用的数据分离开,可以使用分区或者分到一个实体表。
打个电话的回复的回复后vghg
加载更多回复(103)

22,209

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 疑难问题
社区管理员
  • 疑难问题社区
  • 尘觉
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧