0

我有两个表用于两个不同的程序。每个程序都有一个特定的program_instance(program_instance)是程序的年份。

一张表称为“登记者”,另一张表称为“提名”——用于两个在技术上不相关的项目。

我一直在尝试从两张桌子上获取过去参与者的数量。以供参考:

程序实例 ID:

  • 5 = GC 2014
  • 3 = GC 2013
  • 1 = GC 2012
  • 4 = 通用电气 2013
  • 2 = 通用电气 2012

所以我在我的登记表上运行了这个查询,它在 913 毫秒内产生了一个结果:

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);

据我了解,此查询将为我提供“enrollees”表中的行数,其中当前年份的登记者 (program_instance_id = 5) 之前已在另一年登记。据我了解,它产生的结果非常准确。

所以...我在我的“提名”表上运行了这个 EXACT 查询(更改表名)。提名表具有几乎与“登记者”表完全相同的结构(有些列不同,但人员的信息字段相同)。在我取消之前,这个查询运行了半个多小时。它不会像在登记表上那样弹出几乎即时的结果,我不知道为什么需要更长的时间。

我可以想象如果表中有更多的行,但登记者表的行数比提名表多 50k。

我也试过:

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;

唉,同样的结果。登记者的即时结果,提名永无止境。

对于我试图实现的目标,是否有其他选择不会导致永无止境的循环?

4

1 回答 1

0

我建议检查两个表的索引,特别是您在 JOIN 子句中使用的列:first_name、last_name、address1、state、zip 和 program_instance_id。这些列中的一个或多个可能在“enrollees”表中而不是在“nominations”中被索引。

于 2013-10-17T23:35:07.857 回答