我有两个表用于两个不同的程序。每个程序都有一个特定的program_instance(program_instance)是程序的年份。
一个表称为'登记者',另一个表是'提名' - 用于两个与技术无关的程序。
我一直试图从两个表中得到过去参与者的数量。供参考:
program_instance_id:
所以我在我的enrollees表上运行了这个查询,它在913ms产生了一个结果:
SELECT count(*) AS prev_enrollees
FROM outreach.enrollees e1
WHERE e1.program_instance_id = 5 AND EXISTS
(SELECT * FROM outreach.enrollees e2
WHERE e1.first_name = e2.first_name
AND e1.last_name = e2.last_name
AND e1.address1 = e2.address1
AND e1.state = e2.state
AND e1.zip = e2.zip
AND e2.program_instance_id < 5);
根据我的理解,这个查询会给我“登记者”表中的行数,其中当前年份的登记者(program_instance_id = 5)之前已在另一年登记。根据我的理解,它产生的结果非常准确。
所以...我在''nominations'表上运行了这个EXACT查询(更改表名)。提名表几乎具有“登记者”表的确切结构(某些列不同,但人员的信息字段相同)。在我取消之前,此查询运行了半个多小时。它并没有弹出几乎即时的结果,就像在登记者桌上一样,我不知道为什么需要更长的时间。
我可以想象如果表中有更多行,但是enrollee表的行数比提名表多了大约5万行。
我也试过了:
SELECT count(*) AS prev_enrollees
FROM outreach_grow_education.nominations e1
JOIN outreach_grow_education.nominations e2 ON e1.first_name = e2.first_name
AND e1.last_name = e2.last_name
AND e1.address1 = e2.address1
AND e1.state = e2.state
AND e1.zip = e2.zip
AND 4 = e2.program_instance_id
WHERE e1.id IS NOT NULL AND e1.program_instance_id = 2;
唉,同样的结果。对参与者的即时结果,在提名上永无止境。
对于我想要实现的不会导致永无止境的循环,还有其他替代方案吗?
答案 0 :(得分:0)
我建议检查两个表的索引,特别是您在JOIN子句中使用的列:first_name,last_name,address1,state,zip和program_instance_id。有可能这些列中的一个或多个在“登记者”表中被索引,而不是在“提名”中。