多线程数据库查询

时间:2009-07-06 16:37:25

标签: sql-server database multithreading

所以我们有这个终极失败供应商(这是一个很长的故事,但请相信我在这里)创建了一个应用程序,它具有独立但设计相同的数据库,我们需要查询(10他们实际上)。这些数据库中的每一个都用于不同的“位置” - 但它仍然是与所有位置相关的信息。

我编写了一些代码来启动10个独特的线程来向每个单独的数据库发出查询,等待结果完成,然后将它们组合成一组可以被操作的记录。

这里的问题是是否存在阅读10个独立数据库的风险,每个数据库使用相同的凭据,一次性完成?

我预计它应该是一个非问题,因为数据库在任何给定时间都可以有数百个连接,但我想在我致力于这个设计之前得到一些反馈。

MS-SQL,如果你很好奇

4 个答案:

答案 0 :(得分:6)

假设数据库是独立的,我可以看到的最大风险是您将获得每个数据库的不同时间点的视图。这可能是一个非问题,或者您可以通过基于时间标准限制结果集来解决它。

让一个进程打开10个数据库连接并查询它们本身就没有风险。

另一个更复杂的选择是使用单个主服务器和10个DB作为从服务器来设置复制。这取决于数据库,可能是也可能不合理。

答案 1 :(得分:2)

让服务器为您完成所有的工作可能更简单,例如:

SELECT col1, col2 FROM Database1.dbo.SomeTable WHERE <some conditions here>
UNION ALL
SELECT col1, col2 FROM Database2.dbo.SomeTable WHERE <some conditions here>

(snip)

UNION ALL
SELECT col1, col2 FROM Database10.dbo.SomeTable WHERE <some conditions here>

没有多线程,更简单。 只有在所有数据库都在同一个实例上时才应该使用它

答案 2 :(得分:2)

作为一次性操作,您可以在10个线程中运行10个查询(就像您一样),您可以使用异步BeginExecuteReader方法运行10个没有显式线程的查询,您可以将查询聚合到一个一个通过UNION ALL(如Alex所建议的)如果所有数据库都是本地数据库,您甚至可以使用未记录的但众所周知的sp_msforeachdb系统过程。我认为我建议反对的是,如果数据库是分开的,则使用链接服务器。链接服务器会导致可操作期间可能受到影响的可用性依赖性(即,一个链接断开,报告已关闭)。

如果这只是您必须执行此操作的次数中的一次,那么对于更多查询和报告,或许值得考虑将报告数据(例如通过复制)聚合到一个数据库中。

作为旁注,不知道上述供应商的其他问题,在单独的数据库中分离“业务单位”的做法非常普遍,并且在开发工作(=价格)和通用应用程序使用的平衡中经常使用正确的做法。

答案 3 :(得分:0)

您还可以考虑设置链接服务器并在一个大型联合所有语句中进行查询。我会测试两种方式,看看哪种方式更有效。加上链接服务器,如果其中一台服务器出于任何原因停机,整个过程将会失败。根据您的需要,这可能是也可能不是。

编辑添加 如果它们都在同一台服务器上,则您不需要这样做,只需运行一个查询引用每个数据库的所有查询。