访问查询速度不同

时间:2016-06-06 12:51:51

标签: sql performance ms-access

我有一个本地访问数据库,其中有一个查询,它从表单中获取值以填充下拉菜单。奇怪(对我来说)的事情是,对于大多数选项,这个查询很快(眨眼),但是有一些选项它很慢(> 10秒)。 查询的作用如下:它填充一个下拉菜单,记录在特定目击地看到的动物,但只记录那些尚未在特定目击中记录的动物(以避免重复记录)。

SELECT DISTINCT tblAnimals.AnimalID, tblAnimals.Nickname, tblAnimals.Species
FROM tblSightings INNER JOIN (tblAnimals INNER JOIN tblAnimalsatSighting ON tblAnimals.AnimalID = tblAnimalsatSighting.AnimalID) ON tblSightings.SightingID = tblAnimalsatSighting.SightingID
WHERE (((tblAnimals.Species)=[form]![Species]) AND ((tblAnimals.CurrentGroup)=[form]![AnimalGroup2]) AND ((tblAnimals.[Dead?])=False) AND ((Exists (select tblAnimalsatSighting.AnimalID FROM tblAnimalsatSighting WHERE tblAnimals.AnimalID = tblAnimalsatSighting.AnimalID AND tblAnimalsatSighting.SightingID = [form]![SightingID]))=False));

对于4种可能的物种中的2种,其表现良好,1种物种对5组中的4种表现良好,但对最后一组表现不佳,对于最后一种,它对两组都表现得非常缓慢。有人知道这种行为的原因是什么?这是查询问题吗?或表中的重复条目可能导致这种情况?我不认为它在表格中是重复的,我已经检查过,并且有一些,但它们既出现在存在问题的组中,也出现在没有问题的组中。我可以重新编写查询以使其执行得更快吗?

1 个答案:

答案 0 :(得分:0)

正如我们在上面的评论中指出的那样,您确认额外的连接并不是真正需要的,并且实际上将结果限制为已经有目击的动物。这些加入也可能导致经济放缓。

我知道Access可能会自动添加大部分括号,但我已将其删除,并将子查询转换为更易读的not exists形式。

SELECT tblAnimals.AnimalID, tblAnimals.Nickname, tblAnimals.Species
FROM tblAnimals
WHERE
        tblAnimals.Species = [form]![Species]
    AND tblAnimals.CurrentGroup = [form]![AnimalGroup2]
    AND tblAnimals.[Dead?] = False
    AND NOT EXISTS (
        SELECT tblAnimalsatSighting.AnimalID
        FROM tblAnimalsatSighting
        WHERE
                tblAnimals.AnimalID = tblAnimalsatSighting.AnimalID
            AND tblAnimalsatSighting.SightingID = [form]![SightingID]
    );