sql-server - 与性能相关的 : How does SQL Server process concurrent queries from multiple connections from a single . NET 桌面应用程序?

标签 sql-server performance concurrency database-connection

单线程版本说明:

  1. 程序收集问题列表。
  2. 对于每个问题,获取模型答案,并通过评分模块运行每个问题。

  • 评分模块进行大量(只读)数据库查询。
  • 串行处理,单一数据库连接。

我决定通过将问题列表分成 block 并为每个 block 创建一个线程来对上述程序进行多线程处理。

每个线程都会打开自己的数据库连接并处理自己的问题列表(6 个线程中的每一个线程大约有 95 个问题)。应用程序等待所有线程完成,然后聚合结果以进行显示。

令我惊讶的是,多线程版本的运行时间大致相同,用了大约 16 秒而不是 17 秒。

问题:

为什么我没有看到在具有单独连接的单独线程上并发执行查询所期望的那种性能提升?机器有 8 个处理器。

当查询来自单个应用程序时,SQL Server 会并发处理查询,还是它(或 .net 本身)会序列化它们?

可能有什么配置错误,这会使它运行得更快,或者我可能只是将 SQL Server 推向了它的计算极限?

当前配置:

Microsoft SQL Server 开发人员版 9.0.1406 RTM
操作系统:Windows Server 2003 Standard
处理器:8
内存:4GB

最佳答案

这只是瞎猜,但我敢打赌您看不到性能提升,因为由于共享资源(记录)的锁定,它们在数据库中序列化了自己。现在是细则。

我假设您的 C# 代码实际上是正确的,并且您确实启动了单独的线程并并行发出每个查询。无意冒犯,但出于各种原因,我已经看到很多人提出这种说法并且代码实际上在客户端中是串行的。您应该通过监视服务器(通过 Profiler,或使用 sys.dm_exec_requests 和 sys.dm_exec_sessions)来验证这一点。

此外,我假设您的查询具有相似的权重。即,您没有一个线程持续 15 秒和 5 个线程持续 100 毫秒。

您描述的症状(缺乏更多详细信息)表明您在每个线程的开头都有一个写操作,该线程对某些资源进行 X 锁定。第一个线程启动并锁定资源,其他 5 个等待。第一个线程完成,释放资源然后下一个线程获取它,其他 4 个等待。所以最后一个线程必须等待所有其他 5 个线程的执行。这将非常容易通过查看 sys.dm_exec_requests 进行故障排除。并监控是什么阻止了请求。

顺便说一句,您应该考虑使用 Asynchronous Processing=true 并依赖像 BeginExecuteReader 这样的异步方法来并行执行您的命令,而无需客户端线程的开销。

关于sql-server - 与性能相关的 : How does SQL Server process concurrent queries from multiple connections from a single . NET 桌面应用程序?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/895117/

相关文章:

java - 强制异步操作​​阻塞当前线程

java - 避免同时执行两次 Spring @Async 任务

sql - 使用 SQL 从多个表中获取 Count(*)

c# - SQL Server 生产版的行为与开发版不同。编码有问题!

html - 查找 Sql Server 表中包含 HTML 标签的所有行

java - SEAM:有效使用@BypassInterceptors?

mysql - 表中的最小值

php - 在 MySQL 端或 PHP 端处理此查询更好吗?

c# - 显示和隐藏游戏对象的最有效技术?

c++ - MSVC 并发运行时中的 parallel_for_each 和 parallel_for 有什么区别?