我的SQL查询需要多长时间才能完成?

4
我在SQLite Administrator中有一个数据库,其中包含3个表,分别是A、B和C。
表A有3个列p1、p2和p3,大约有200万行。
表B有2个列p1和p4,也有200万行左右。
表C有1个列p4,大约有80万行。
我尝试运行的查询如下:
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,


我猜你还没有在表格上创建索引? - BenW
我认为这对于 Stack Overflow 来说回答你会非常困难。作为 DBA(或 DB 程序员),你的职责之一就是学习关于系统性能特征的知识。涉及的变量太多了,我们对它们一无所知:索引、虚拟内存、磁盘空间、磁盘速度、键等。但是,考虑到你准备再等 6 天,为什么不等等呢? - High Performance Mark
嗯,看起来没有索引,磁盘空间应该足够(大约有10 GB的可用空间),磁盘速度是5800RPM,如果你是指这个的话。我本来可以等6天,但我担心这个查询会花费更多时间。 - Sunny88
2个回答

4

如果没有索引,3天内没有什么奇怪的事情发生。

如果A、B、C上没有索引,则您的查询将对A x B x C进行全扫描。A x B x C中的记录数为

SELECT COUNT(*)
FROM A,B,C

这是一个关于IT技术的翻译:(2*10^6) * (2*10^6) * (0.8*10^6) = 3.2 * 10^18

假设你能在一秒钟内对十亿条记录应用where条件,你仍需要3.2 * 10^9秒。这相当于101年多一点。

然而,如果在p1和p4上建立索引,优秀的关系型数据库管理系统将能够直接访问结果,而不是扫描完整的笛卡尔积(我认为有些数据库会选择构建临时索引,这仍然很慢,但会使查询实际执行)。


我明白了!我想我会先终止查询,然后创建索引。 - Sunny88
2
我创建了索引并重新运行了它... 它在49秒内完成了。 谢谢,StackOverflow) - Sunny88

0

你在A.p1、B.p1、B.p4和C.p4上有索引吗? 如果没有,那么最好停止它,否则可能需要运行数年。

对于这种操作,你需要更大的东西。这根本不是Lite。考虑切换到另一个RDBMS。


我不确定索引。它们不是由我自己创建的,但也许是sqlite自动创建的?我通过导入文本文件来创建表。 - Sunny88
当然没有创建索引。没有自动创建索引。主键、外键、唯一键、索引……所有这些都必须手动定义。 - Alex
你认为MySQL会比SQLite更快吗? - Sunny88
@Alexander,你之间引擎的比较可能会误导人。 - Unreason
此外,SQLite 在任何多用户写入访问方面都非常轻便。虽然它主要是单用户,但对于像这样的工作负载来说,它仍然是一个合理的引擎。 - Unreason
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接