查找丢失的钥匙

时间:2011-06-03 14:25:24

标签: sql ms-access

我可以加快Access 2007年的声明吗?

SELECT *
FROM (SELECT DISTINCT p.zipcode, p.place FROM p) AS tmp
WHERE NOT EXISTS 
  (SELECT * FROM zipcodes WHERE 
    (tmp.zipcode=zipcodes.zipcode) AND (tmp.place=zipcodes.place));

我想找到p表中不在zipcodes表中的(邮政编码,地点)组合。

p表相当大,但减少到tmp时有大约40.000个条目。 zipcodes表有大约15.000个条目。 zipcodes表被编入索引(zipcode,place)。

获得我的结果需要一个多小时。我可以加快速度吗?我可以在Access 2007中看到执行计划吗? (我不是常规的Access用户,也不是SQL专家。)

亲切的问候, 卡斯滕。

2 个答案:

答案 0 :(得分:5)

您可以LEFT JOIN两个表并从结果集中排除匹配的行。在zipcode和地方索引的zipcodes表,这可能比你现在快得多。希望足够快,你不需要求助于创建一个中间临时表。

SELECT DISTINCT p.zipcode, p.place
FROM p LEFT JOIN zipcodes AS z ON (p.place = z.place) AND (p.zipcode = z.zipcode)
WHERE (((z.zipcode) Is Null));

修改:您要求查看执行计划。从TechRepublic上的这篇文章开始:Use Microsoft Jet's ShowPlan to write more efficient queries您还可以通过在网上搜索“Jet ShowPlan”来查找更多信息。

答案 1 :(得分:1)

首先,我会创建一个'真实'表tmp,而不是以这种方式使用它。仅这一点可能已经有所帮助(不确定)。其次,我会确保表p中有一个zipcode索引,如果这没有帮助,也可以在表tmp上找到。如果这仍然无效,还可以在zipcodes上创建(邮政编码,地点)组合的索引。