访问2000查询执行时间

时间:2011-03-03 08:48:53

标签: sql ms-access ms-access-2000

我有两个表,如Parent-Child。在Parent表中,有7211条记录。在Child,有169498条记录。在这两个表之间没有关系(手段没有设置外键,但使用parentID)。在Child表中,有额外的记录和缺失的记录。

作为样本,

Parent Table - tblParent
PID     PName
A001    John
B002    Mary
...     ...

Child Table  - tblChild
PID   TID   Desc
A001  056   Book
Y004  087   Pen
...   ...   ...

我的查询如下,

SELECT PID
FROM tblParent
WHERE PID NOT IN
(
SELECT PID
FROM tblChild
)

以实际号码运行它。记录,MS Access 2000突然停止。如果我用10条记录测试它,它可以正常工作。主要原因是什么?没有记录?

我尝试另一种方式。

SELECT C.PID, P.PID
FROM tblChild C, tblParent P
WHERE C.PID <> P.PID

此时,结果会成倍增加。 (我的意思是一个带有所有P.PID的C.PID然后等......)

如何在Access 2000中的最短执行时间内获取额外和丢失的记录?

2 个答案:

答案 0 :(得分:1)

首先,您在PID列上有索引吗?它应该是tblParent中的主键和tblChild中的非唯一索引。设置外键关系会为你创建这些索引(我相信)。

您可以减少需要匹配的记录数。如果你要运行这个SQL:

SELECT DISTINCT PID
FROM tblChild
WHERE PID IN (
    SELECT PID
    FROM tblParent
)

您只能获得应该在tblParent表中的父PID。然后把它组合起来像

SELECT PID
FROM tblParent
WHERE PID NOT IN
(
    SELECT DISTINCT PID
    FROM tblChild
    WHERE PID IN (
        SELECT PID
        FROM tblParent
    )
)

应该有助于加快查询速度,找到所有没有孩子的父母。

要查找额外的儿童记录,您可以

SELECT DISTINCT PID
FROM tblChild
WHERE PID NOT IN (
    SELECT PID
    FROM tblParent
)

不幸的是,我没有Access来测试它。我希望它有所帮助

答案 1 :(得分:0)

这是因为您在子查询中选择了169 498条记录:

SELECT PID
FROM tblChild

这是很多。整个tblChild表可能被扫描,从磁盘读取,PID列被分离并存储在内存中的所有位置,所有169 498值。然后,您读取所有7211记录并检查每个记录是否不在169 498大小的子PID数据集中。这对Access来说很重要。