我可以加快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专家。)
亲切的问候, 卡斯滕。
答案 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
上创建(邮政编码,地点)组合的索引。