如果有帮助,请指导我转换表格。我有2个具有数百万条记录(边缘和节点)的表。我必须将它们加入2列,其中列的内容是文本。 基本的工作查询是(但很慢):
select * from EDGES
inner join NODES on EDGES.sourcename = NODES.name
or EDGES.targetname = NODES.name
如果没有,是否有任何更快的方法来获得结果?数据库为15GB,此查询可能需要2天以上的时间。
桌子就像
allNODES之间感兴趣的NODES是:
name address
---------------------
yahoo yahoo.com
google google.com
MSN MSN.com
所有边缘
sourcename targetname
--------------------------
MSN google
yahoo google
google MSN
amazon google
amazon yahoo
yahoo amazon
amazon stackoverflow
stackoverflow amazon
MSN amazon
结果可能看起来像这样:
sourcename targetname
--------------------------
MSN google
yahoo google
google MSN
amazon google
amazon yahoo
yahoo amazon
MSN amazon
答案 0 :(得分:0)
我仍然不清楚您要如何获得结果,但是您可以通过做一些基本的清理工作来大大缩小数据库的大小并加快查询速度,例如使用整数代替{{ 1}} junction table。 (整数比字符串占用更少的空间,并且比字符串更容易 lot ,因此您要尽可能多地使用它们来建立关系)
首先,在节点表的edges
列中为rowid加上别名:
INTEGER PRIMARY KEY
(我假设名称是唯一的;否则,您将要进行适当的更改并在该列上添加一个普通索引(编辑:我怀疑您在CREATE TABLE nodes(id INTEGER PRIMARY KEY
, name TEXT NOT NULL UNIQUE
, address TEXT);
INSERT INTO nodes(name, address) VALUES
('google', 'google.com')
, ('MSN', 'microsoft.com');
-- etc.
上没有索引,将有助于解释一个非常慢的查询))。
然后使您的边表引用id列而不是名称一(也假设每个nodes.name
对都是唯一的):
(source,dest)
({Documentation for WITHOUT ROWID,如果您从未见过。)
然后您问题中的查询将变为:
CREATE TABLE edges(source INTEGER REFERENCES nodes(id)
, dest INTEGER REFERENCES nodes(id)
, PRIMARY KEY(source, dest)) WITHOUT ROWID;
INSERT INTO edges(source, dest) VALUES
((SELECT id FROM nodes WHERE name='MSN'), (SELECT id FROM nodes WHERE name='google'))
, ((SELECT id FROM nodes WHERE name='google'), (SELECT id FROM nodes WHERE name='MSN'));
-- etc.