0

我目前正在编写一个应用程序,该应用程序需要能够从数百万用户中选择一个 ID 子集......

我目前正在编写软件以从包含巴西人口 200.000.000 (200M) 的整个列表的表中选择一组 100.000 个 ID,我需要能够在合理的时间内完成此操作... ID on Table = XML 上的 ID

我正在考虑解析 xml 文件并启动一个在数据库上执行 SELECT 语句的线程,我需要为每个线程建立一个连接,但这种方式似乎是一种蛮力方法,也许有更优雅的方式?

1)什么是最好的数据库来做到这一点?2)数据库连接数量的合理限制是多少?

4

4 回答 4

2

进行 100.000 次查询将花费很长时间,并且在单独的线程上拆分工作对您没有多大帮助,因为您正在从同一个表中读取。

不要一次只得到一条记录,而是将 100.000 个项目分成相当小的批次,例如每个 1000 个项目,您可以将它们发送到数据库。在数据库中使用这些 id 值创建一个临时表,并对数据库表进行连接以获取这些记录。

例如,使用 MS SQL Server,您可以将一批项目作为 XML 发送到存储过程,该存储过程可以从中创建临时表并查询数据库表。

于 2012-10-09T23:29:22.610 回答
1

任何可以处理现有 200M 行表的现代 DBMS,与 100K 行表相比都应该没有问题(假设您的硬件已经达到标准)。

理想的解决方案:将您的 XML(至少是 ID)导入到新表中,确保您正在比较的列被正确索引。然后查询。

于 2012-10-09T23:38:57.597 回答
0

什么语言?如果您使用 .NET,您可以将 XML 和 SQL 作为数据源加载,然后我相信有一些可枚举的函数可用于比较数据。

于 2012-10-09T23:22:20.923 回答
0

做这个:

  • 解析 XML 并将提取的 ID 存储到临时表1中。
  • 从主表中,仅选择其 ID 也存在于临时表中的行:

    SELECT * FROM MAIN_TABLE WHERE ID IN(从 TEMPORARY_TABLE 中选择 ID)

即使您最终使用了批处理/分块和并行化,体面的 DBMS 通常也会比您更快地完成这项工作。


1临时表通常是使用CREATE [GLOBAL|LOCAL] TEMPORARY TABLE ...语法创建的,您可能希望它对会话私有(检查您的 DBMS 对GLOBALvs.的解释LOCAL)。如果您选择的 DBMS 不支持临时表,您可以改用“普通”表,但请注意不要让并发会话在您仍在使用该表时弄乱该表。

于 2012-10-10T12:49:33.883 回答