博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
SQL Server提高并发查询效率
阅读量:5345 次
发布时间:2019-06-15

本文共 812 字,大约阅读时间需要 2 分钟。

同事写了个程序用创建多个线程使用ado同时对同个数据库进行相同的查询,涉及2张数据表的联查。当线程数非常多的情况下,读取数据的效率就会变得很慢,例如50个线程同时查询大概3000条数据,查询完成后通过游标全部读取到本地需要大概30秒。单个线程可能就一两秒。这是由于数据库锁导致的。

同样的程序在我的机子上运行性能提高了1倍。主要原因由于我连接的sql server是企业版的,而同事那个连接的数据库是开发版的,企业版的sql server对并发访问做了一定的优化。

但是这个性能还是不够高。于是我尝试去去除数据库锁。可以通过在查询语句前面增加SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED,或者在查询语句的表名后面加上(nolock)。根据msdn的解释,这两种方式是一样的,就是通过不加锁的方式提高查询效率,而导致的后果就是会查询到未提交的事务的数据。不过由于所查询的表格都是插入操作,所以不会有影响。第一种方式是针对整个查询事务,而nolock是针对查询的表格,所以如果使用nolock方式需要对每个表后面都加上(nolock)。但是实际测试的情况确实执行SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED方式查询效率有较大的改善,而使用nolock方式查询效率基本不变。在网上找了很久还是没有结果,希望有高手知道原因留个言,不胜感激。

再说说以上两种方式,测试中第一种能够提高查询效率,但是由于程序使用的是ado的方式访问数据库,使用第一种方式会导致游标无法移动到特定位置,而只能向前移动。所以无法使用第一种方式。坑爹的ado,看来要尽快找到另一种数据库访问方式来替代ado,不然老是需要根据ado来更改数据库设计。

转载于:https://www.cnblogs.com/dyllove98/p/3172169.html

你可能感兴趣的文章
python selenium 最简单示例
查看>>
UITabBarController动态添加TabBarItem
查看>>
Nginx 切片模块、断点续传
查看>>
MySQL 创建用户并分配用户权限
查看>>
typedef 函数指针
查看>>
UIScrollView的代理(delegate)
查看>>
【原创】.Net WebForm Calendar 日历控件常用方法
查看>>
对javascript中的匿名函数的理解
查看>>
noip模拟赛 道路分组
查看>>
【Python web 开发】django 从请求到响应经历了什么?
查看>>
移动端调试痛点?——送你五款前端开发利器
查看>>
贴心小棉袄
查看>>
关于this在不同使用情况表示的含义
查看>>
汇编实现: C库常见函数,串操作指令作用
查看>>
python中lambda表达式应用
查看>>
spring集成mongodb jar包版本问题
查看>>
ajax
查看>>
周赛Problem 1025: Hkhv love spent money(RMQ)
查看>>
[opencv] cv::Mat_类有时候可以替代cv::Mat类
查看>>
【BZOJ1257】【CQOI2007】余数之和sum
查看>>