【发布时间】:2019-08-01 21:37:24
【问题描述】:
上下文
我在两个单独的 SQlite 数据库 (db1,db2) 中有两个表 (A, B),我想合并(或加入,无论数据库中的正确术语是什么) . TABLE A 在 161GB 数据库 db1 中存储了大约 1.5 亿条记录,而 TABLE B 在 173GB 数据库db2 中存储了大约 2.92 亿条记录。我正在尝试通过 ATTACH-ing db2 到 db1 并运行规范的 JOIN 查询来合并这两个表。
问题
下面的代码已经连续运行了 4 天以上,db1 数据库文件或其日志文件没有任何明显的变化。如果我使用 LIMIT 1000 子句运行测试查询,则 JOIN 将在不到一秒的时间内运行。对于全尺寸表,该操作似乎永远运行。我可以看到,正在从中读取数据的硬盘一直在 100% 使用,但它永远不会超出此范围(因此显然也没有输出显示)。
conn = sqlite3.connect("/".join([data_path, 'db1.db']))
c = conn.cursor()
## attach 2nd db
query = """
ATTACH ".../db2.db" as db2;
"""
c.execute(query)
conn.commit()
## merge query
query = """
CREATE TABLE ABjoined AS
SELECT id,col2 FROM A INNER JOIN db2.B
ON A.id = db2.B.id;
"""
c.execute(query)
c.commit()
更新
我很想创建一个最小的可重现示例,但似乎唯一的触发器是表大小。我只能考虑生成两个 150GB 的数据库进行合并,但这似乎不是最优的。我愿意接受建议
【问题讨论】:
-
您是否考虑过 SQLite 可能不适合这项工作? (Lite 的存在是有原因的。)
-
@tonypdmtr 它开始引起人们的注意
-
@tonypdmtr 另一方面,SQlite 能够执行类似大小的 JOIN 操作,但它都在一个数据库中 - 而这里有两个数据库。也许这就是魔鬼藏身的地方
-
根据sqlite.org/whentouse.html,数据库最高可达140TB。在实践中,它可能会起作用,但响应时间可能是“不可接受的”。我并不是说 SQLite3 不能处理这么多数据,但可能一个不同的引擎会做得更快。 SQLite3 的一大优点是使用单个文件来保存完整的数据库。然而,同样的事情可能会成为它最大的敌人,因为文件大小增长得太多,因为 FS/OS 引入的开销可能会大大减慢速度。只是在你的具体情况下猜测这是否是一个真正的问题。交易中的
INSERT有帮助。 -
@tonypdmtr 感谢您的建议!将表
B移动到db1,然后在db1中执行合并。