我在SQLite Administrator中有一个数据库,有3个表,比如A,B和C.
表A具有3列p1,p2和p3,具有约2百万行.
表B有2列p1和p4,也有大约2百万行.
表C具有1列p4,具有约800,000行.
我尝试运行的查询如下:
SELECT A.p1, B.p4, A.p2, A.p3
FROM A,B,C
WHERE A.p1=B.p1 AND B.p4=C.p4
查询已经花了3天,仍然没有完成.我想知道我是应该中止还是等到它完成.如果它将在接下来的5-6天内完成,我可能会等待,但如果需要更多,我将不得不中止它.
我应该等不及?
我的PC规格是:
Core 2 duo 1.86GHz,2 GB RAM,
最佳答案 我会说3天内没什么奇怪的(如果没有索引).
如果A,B,C上没有索引,那么您的查询将对A x B x C进行全面扫描.
A x B x C中的记录数为
SELECT COUNT(*)
FROM A,B,C
即(2 * 10 ^ 6)*(2 * 10 ^ 6)*(0.8 * 10 ^ 6)= 3.2 * 10 ^ 18
假设您可以在一秒内将where条件应用于十亿条记录,那么您仍然需要3.2 * 10 ^ 9秒.这已经超过101年了.
但是,如果您在p1和p4上有索引,那么RDBMS将能够直接访问结果并且不扫描完整的笛卡尔积(嗯,我认为某些DB会选择构建临时索引,这仍然会很慢,但会使查询实际执行).