请高手指点并发问题
服务器配置:64G内存,24核cpu.
后台有30多个线程都在并发处理一个耗时5-10几分钟的sql语句处理数据库数据,每个线程都会隔1分钟执行一次,慢慢导致服务器和数据库很迟钝,有时候数据库直接就挂了,不知道什么原因,难道是数据库支持不了那么多的并发或那么多的耗时并发吗?
望高手解答,并最好给出解决方案。
[解决办法]
1. 这条sql语句执行什么,sql语句复杂吗?关联多少个表?新增\修改\还是删除?具体到某一个表.
2. 操作的表数据量是不是很大,或者是两个大表相关联查询再更新?关联字段是否建了索引,时间久了要重建索引,你先重建索引试看有没有速度提升?
3. 如果建立了索引后还得不到改善,那么就考虑做分区表,多核cpu对分区表的查询或更新就是它的长处,多个cpu可以并行处理事务.
[解决办法]
并发的东西要考虑锁和隔离级别,这个其实是业务需求,不是技术需求。优良的设计可以支持5、6000个并发请求,对于这些操作,第一个要快,不然其他会话需要等待。第二个要尽可能把影响范围缩小,每次都加表锁的话肯定慢。2005以后,分区是比较好的解决并发问题的方案之一。第三个就是用队列——ssb
[解决办法]
同时有30个线程(它们运行在数据库服务器上?)各执行一个5-10分钟的sql?
数据库服务器的cpu始终的100%?
[解决办法]
如果你这个SQL语句是必须执行不可的,建议你另外建立一台服务器,在这台新建服务器上去执行,不要影响原服务器的效率,新建服务器上执行完成以后,先存到本地,然后再定时更新到你的主服务器上去,如果需要实时更新也可以建立2台服务器之间的链接,用新建服务器做为运算服务器,运算完成后,再把数据实时同步过去.
[解决办法]
只有实际分析,并改进(结构或代码或优化流程)性能,是正道
[解决办法]
技术社区里面说,国外的程序写的的程序,最大并行度设为4,效果最好。
而据我在国内的经验,国产“码农”的代码,最大并行度设为1(不使用CPU并行)时效果最好。
所以,楼主还是考虑优化一下代码吧。
[解决办法]
由于CPU24核,内存也比较大,一般50%
同时有30个线程(它们运行在数据库服务器上?)各执行一个5-10分钟的sql?
数据库服务器的cpu始终的100%?
是不是数据被锁了,这样就会导致死锁。
你的问题是需要你自己进行平衡的,现在你不建索引,确实是插入速度快,但是查询速度非常慢。
我原来的公司,接近1.5一条数据的表和另一个几千万数据的表进行关联,语句非常复杂,都是接近10个表的管关联,通过建立索引,每次运行,都可以控制在20秒以内,但如果不建索引的话,10分钟都运行不完,还好是报表,不是定时任务,要是定时任务的话,在本次定时任务没运行完,一会就又触发下一次定时任务,那么数据库积压了N多个语句要运行,再强的服务器也得歇菜,数据库肯定得崩溃,那台服务器也就是32G的内存,8个核心线程,性能方面和你的服务器没办法比的。
你上面说每20分钟会有一批几百万的数据插入,我觉得通过大批量插入技术,应该是非常快的,我在公司另一台服务器试过,插入几十万条数据,也就20秒左右,那服务器的性能是很一般的。
通过建立索引,当然啦,插入速度会下降一点,但由此在查询方面取得的性能提升,让数据库不再崩溃,这才是最重要的。
这个还是得加强测试,调优。
现在处理数据的方式是通过 SELECT INTO 的方式将处理结果插入到另外一张新表中,然后在新表中进行下一步处理,这样方式有没有优化和改进的地方?
你的问题是需要你自己进行平衡的,现在你不建索引,确实是插入速度快,但是查询速度非常慢。
我原来的公司,接近1.5一条数据的表和另一个几千万数据的表进行关联,语句非常复杂,都是接近10个表的管关联,通过建立索引,每次运行,都可以控制在20秒以内,但如果不建索引的话,10分钟都运行不完,还好是报表,不是定时任务,要是定时任务的话,在本次定时任务没运行完,一会就又触发下一次定时任务,那么数据库积压了N多个语句要运行,再强的服务器也得歇菜,数据库肯定得崩溃,那台服务器也就是32G的内存,8个核心线程,性能方面和你的服务器没办法比的。
你上面说每20分钟会有一批几百万的数据插入,我觉得通过大批量插入技术,应该是非常快的,我在公司另一台服务器试过,插入几十万条数据,也就20秒左右,那服务器的性能是很一般的。
通过建立索引,当然啦,插入速度会下降一点,但由此在查询方面取得的性能提升,让数据库不再崩溃,这才是最重要的。
这个还是得加强测试,调优。
还有就是我查询的时候条件不一样,可能查询的字段也不一样,有可能是很多字段进行条件查询,这样的话给哪个字段建立索引比较合适,或者是全部建索引?
那所有这些查询条件中,有没有必选的那种条件呢,也就是不管where后面有多少条件,总有一个字段是必选的过滤条件,可以给按照这个字段建索引,另外,这种建索引的字段,最好是能起到过滤数据的作用,比如表中有1000万条数据,通过字段能过滤掉大部分数据。
[解决办法]
你先试试建索引,如果速度不行,你自己测试一下,这个过程中哪个语句比较慢的,最好能把慢的语句贴出来。