在sqlite3中,假设我有一个索引数据库,这里的索引意味着所有表行中的每个字符串信息都已被整数替换,并且在包含整数和字符串映射的所有表上为每个字段都有一个表。
现在,我想在我的索引数据库中添加另一个尚未以这种方式处理的数据库--即仍然存在行中的实际字符串。这些表具有完全相同的结构,因此对于新数据库中的每个表,我会将所有行添加到旧数据库中的相应表中--但是使用整数替换字符串w.r.t。旧数据库中的字符串-整数映射(并更新新数据库中未在旧数据库中看到的字符串的映射)。
有什么更好的方法吗?
应用程序将是一个分布式索引过程,我在其中运行大约。10个作业用较小的数据库填充FIFO队列,我运行一个作业从队列中选择数据库,索引它们并将它们添加到最终的大数据库中。
发布于 2016-06-30 11:42:52
我从python访问了数据库。
我最后所做的是将内存中的索引结构作为python对象来维护,直到所有包含内容的整数行都添加到新的数据库中为止。这允许我通过executemany()函数进行批量插入。将所有行添加到数据库后,python索引对象将大量插入到数据库中。
这与动态使用数据库作为索引结构相比,工作速度非常快。然而,它至少有以下两个缺点:
我不得不说,我没有尝试使用SSD,这可能会使基于内存的方法变得不必要。
发布于 2016-06-28 16:22:38
索引表如下所示:
CREATE TABLE data ( ColX INTEGER, ColY INTEGER );
-- foreign key constraints omitted
让我们假设索引表对string列有一个唯一的约束:
CREATE TABLE ColX_strings ( ID INTEGER PRIMARY KEY, Text TEXT UNIQUE );
CREATE TABLE ColY_strings ( ID INTEGER PRIMARY KEY, Text TEXT UNIQUE );
然后,我们可以简单地使用插入或忽略来添加那些新的字符串,即不与任何旧字符串冲突的字符串:
INSERT OR IGNORE INTO ColX_strings(Text) SELECT ColX FROM newDB.data;
INSERT OR IGNORE INTO ColY_strings(Text) SELECT ColY FROM newDB.data;
现在所有的字符串都是已知的,所以我们只需在复制时查找它们:
INSERT INTO oldDB.data(ColX, ColY)
SELECT (SELECT ID FROM ColX_strings WHERE Text = T.ColX),
(SELECT ID FROM ColY_strings WHERE Text = T.ColY)
FROM newDB.data AS T;
https://stackoverflow.com/questions/38077231
复制相似问题