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

请并发有关问题

2013-10-12 
请高手指点并发问题服务器配置:64G内存,24核cpu.后台有30多个线程都在并发处理一个耗时5-10几分钟的sql语

请高手指点并发问题
服务器配置: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并行)时效果最好。
所以,楼主还是考虑优化一下代码吧。
[解决办法]

引用:
Quote: 引用:

你可以先尝试建立索引,看看速度能够提高多少

因为数据对插入效率要求很高,每20分钟有几百万数据插入并进行联合处理,如果建立索引会影响插入速度。


每20分钟有几百万数据插入并进行联合处理,你能不能把sql语句帖出来,看看是否可能优化?
我觉得一次性插入几百万,cpu消耗那么多不奇怪,能不能改个方案,每隔两分钟插入十几万数据,或者几十万数据,评估一下二三十万这样平均需要多少时间,这样插入频率高一些,有可能分担cpu的使用率
[解决办法]
引用:
Quote: 引用:

同时有30个线程(它们运行在数据库服务器上?)各执行一个5-10分钟的sql?
数据库服务器的cpu始终的100%?
由于CPU24核,内存也比较大,一般50%


24核的50%,说明12核已经满负荷
长时间持续这么密集的插入,是影响正常运行了
提高硬盘的性能(多硬盘组成阵列或ssd)

这是什么样的应用、背景?
[解决办法]
是不是数据被锁了,这样就会导致死锁。
[解决办法]
引用:
是不是数据被锁了,这样就会导致死锁。


死锁不会导致cpu高吧
[解决办法]
你的问题是需要你自己进行平衡的,现在你不建索引,确实是插入速度快,但是查询速度非常慢。

我原来的公司,接近1.5一条数据的表和另一个几千万数据的表进行关联,语句非常复杂,都是接近10个表的管关联,通过建立索引,每次运行,都可以控制在20秒以内,但如果不建索引的话,10分钟都运行不完,还好是报表,不是定时任务,要是定时任务的话,在本次定时任务没运行完,一会就又触发下一次定时任务,那么数据库积压了N多个语句要运行,再强的服务器也得歇菜,数据库肯定得崩溃,那台服务器也就是32G的内存,8个核心线程,性能方面和你的服务器没办法比的。

你上面说每20分钟会有一批几百万的数据插入,我觉得通过大批量插入技术,应该是非常快的,我在公司另一台服务器试过,插入几十万条数据,也就20秒左右,那服务器的性能是很一般的。


通过建立索引,当然啦,插入速度会下降一点,但由此在查询方面取得的性能提升,让数据库不再崩溃,这才是最重要的。

这个还是得加强测试,调优。


[解决办法]
bcp、bulk insert 都能处理大数据量插入,如果是相对静态的库,还可以先切换恢复模式,同时如果表有分区,那理论上还能加快插入的速度
[解决办法]
select into的速度其实也不低了。几百万数据查到一个临时表我试过少于10秒就完成了
[解决办法]
引用:
Quote: 引用:

你的问题是需要你自己进行平衡的,现在你不建索引,确实是插入速度快,但是查询速度非常慢。

我原来的公司,接近1.5一条数据的表和另一个几千万数据的表进行关联,语句非常复杂,都是接近10个表的管关联,通过建立索引,每次运行,都可以控制在20秒以内,但如果不建索引的话,10分钟都运行不完,还好是报表,不是定时任务,要是定时任务的话,在本次定时任务没运行完,一会就又触发下一次定时任务,那么数据库积压了N多个语句要运行,再强的服务器也得歇菜,数据库肯定得崩溃,那台服务器也就是32G的内存,8个核心线程,性能方面和你的服务器没办法比的。

你上面说每20分钟会有一批几百万的数据插入,我觉得通过大批量插入技术,应该是非常快的,我在公司另一台服务器试过,插入几十万条数据,也就20秒左右,那服务器的性能是很一般的。


通过建立索引,当然啦,插入速度会下降一点,但由此在查询方面取得的性能提升,让数据库不再崩溃,这才是最重要的。

这个还是得加强测试,调优。

现在处理数据的方式是通过 SELECT INTO 的方式将处理结果插入到另外一张新表中,然后在新表中进行下一步处理,这样方式有没有优化和改进的地方?


select into 的速度非常快,是一般insert into的10倍左右,这个有点类似于oracle的直接路径加载,将一个选出来的结果集直接保存成一个新表

[解决办法]
引用:
Quote: 引用:

你的问题是需要你自己进行平衡的,现在你不建索引,确实是插入速度快,但是查询速度非常慢。

我原来的公司,接近1.5一条数据的表和另一个几千万数据的表进行关联,语句非常复杂,都是接近10个表的管关联,通过建立索引,每次运行,都可以控制在20秒以内,但如果不建索引的话,10分钟都运行不完,还好是报表,不是定时任务,要是定时任务的话,在本次定时任务没运行完,一会就又触发下一次定时任务,那么数据库积压了N多个语句要运行,再强的服务器也得歇菜,数据库肯定得崩溃,那台服务器也就是32G的内存,8个核心线程,性能方面和你的服务器没办法比的。

你上面说每20分钟会有一批几百万的数据插入,我觉得通过大批量插入技术,应该是非常快的,我在公司另一台服务器试过,插入几十万条数据,也就20秒左右,那服务器的性能是很一般的。


通过建立索引,当然啦,插入速度会下降一点,但由此在查询方面取得的性能提升,让数据库不再崩溃,这才是最重要的。

这个还是得加强测试,调优。

还有就是我查询的时候条件不一样,可能查询的字段也不一样,有可能是很多字段进行条件查询,这样的话给哪个字段建立索引比较合适,或者是全部建索引?


索引建的越少越好,因为你每个一段时间就会插入大量数据。

你的意思是查询里,比如有时候是 where 字段1 = xxx and 字段2 = yyy ……,就是这种条件的个数是不一定的,会有变化是吧。



那所有这些查询条件中,有没有必选的那种条件呢,也就是不管where后面有多少条件,总有一个字段是必选的过滤条件,可以给按照这个字段建索引,另外,这种建索引的字段,最好是能起到过滤数据的作用,比如表中有1000万条数据,通过字段能过滤掉大部分数据。
[解决办法]
你先试试建索引,如果速度不行,你自己测试一下,这个过程中哪个语句比较慢的,最好能把慢的语句贴出来。

热点排行