Sql ACCESS 2000:查询“;连锁店;加上“太慢了”;其中;条款

Sql ACCESS 2000:查询“;连锁店;加上“太慢了”;其中;条款,sql,performance,ms-access,Sql,Performance,Ms Access,前提 我必须修改一个非常旧的Access 2000数据库。 我有两张桌子: 产品表: pID为文本-这是关键字段(是的,是文本,对此我无能为力) 以整数形式分级-这是产品级别:0=成品,1到7=子产品 p以文本形式描述-仅为描述 p-关联表: 将父项作为文本 pIDChild作为文本 此表所做的是(子)产品和其他子产品之间的关联。 “规则”是pIDChild级别必须高于pidpparent级别 然后有一个表单显示给定pID的所有子项。这是基于查询的“链”: 这是查询q-pAssociat

前提

我必须修改一个非常旧的Access 2000数据库。 我有两张桌子:

产品表:

  • pID为文本-这是关键字段(是的,是文本,对此我无能为力)
  • 以整数形式分级-这是产品级别:0=成品,1到7=子产品
  • p以文本形式描述-仅为描述
p-关联表:

  • 将父项作为文本
  • pIDChild作为文本
此表所做的是(子)产品和其他子产品之间的关联。 “规则”是pIDChild级别必须高于pidpparent级别

然后有一个表单显示给定pID的所有子项。这是基于查询的“链”:

这是查询q-pAssociation0,它查看所选产品并返回child:

SELECT DISTINCTROW [t-Associations].pIDParent, [t-Associations].pIDChild, [t-Products].pLevel AS pParentLevel, [t-Products].pLevel AS pChildLevel FROM [t-Products] INNER JOIN [t-Associations] ON [t-Products].pID = [t-Associations].pIDChild
WHERE ((([t-Associations].pIDParent)=[Forms]![fTreeProdotti]![txtProdID]));
然后有7个查询(q-pAssociation1~q-pAssociation7),每个查询都处理前一个查询。 以下是q-pAssociation1:

SELECT DISTINCTROW [q-pAssociation0].pIDChild AS pIDParent, [t-Associations].pIDChild, [q-pAssociation0].pChildLevel AS pParentLevel, [t-Products].pLevel AS pChildLevel FROM [q-pAssociation0] INNER JOIN ([t-Products] INNER JOIN [t-Associations] ON [t-Products].pID = [t-Associations].pIDChild) ON [q-pAssociation0].pIDChild = [t-Associations].pIDParent;
最后,还有一个组查询,它将以前的所有查询分组,并将表单基于这些查询

问题 我必须修改这一切,以便查询只返回Level=parentlevel+1的Child(因此,如果父级有一个child2级别“down”或更多,则不必返回

因此,我在每个查询中添加了一个条件:

SELECT DISTINCTROW [q-pAssociation0].pIDChild AS pIDParent, [t-Associations].pIDChild, [q-pAssociation0].pChildLevel AS pParentLevel, [t-Products].pLevel AS pChildLevel
FROM [q-pAssociation0] INNER JOIN ([t-Products] INNER JOIN [t-Associations] ON [t-Products].pID = [t-Associations].pIDChild) ON [q-pAssociation0].pIDChild = [t-Associations].pIDParent
WHERE ((([t-Products].pLevel)=[q-pAssociation0]![pParentLevel]+1));
但是现在q-pAssociation7需要10分钟才能返回大约15条记录,而如果没有“WHERE”条件,它几乎可以立即返回大约25条记录


我如何才能只获得只差一级的产品而不进行这种缓慢的查询?

如果您创建了一个查询来隔离所有相隔一级的关联,可能会有所帮助

SELECT a.pIDParent, a.pIDChild, tP.pLevel AS pParentLevel, tC.pLevel AS pChildLevel
FROM ([t-Associations] AS a INNER JOIN [t-Products] AS tP ON a.pIDParent = tP.pID) 
    INNER JOIN [t-Products] AS tC ON a.pIDChild = tC.pID
WHERE (((tC.pLevel)=[tP].[pLevel]+1));
…将其保存为[q-one_level_down],然后在查询中使用它,这样您就不必(显式地)返回Products表来获取级别

如果您这样做,那么您的[q-pAssociation0]查询将变成

SELECT [q-one_level_down].pIDParent, [q-one_level_down].pIDChild, 
    [q-one_level_down].pParentLevel, [q-one_level_down].pChildLevel
FROM [q-one_level_down]
WHERE ((([q-one_level_down].pIDParent)=[Forms]![fTreeProdotti]![txtProdID]));
…而且(我相信)您的[q-Passaction1]查询变得

SELECT [q-one_level_down].pIDParent, [q-one_level_down].pIDChild, 
    [q-one_level_down].pParentLevel, [q-one_level_down].pChildLevel
FROM [q-pAssociation0__NEW_] INNER JOIN [q-one_level_down] 
    ON ([q-pAssociation0__NEW_].pChildLevel = [q-one_level_down].pParentLevel) 
        AND ([q-pAssociation0__NEW_].pIDChild = [q-one_level_down].pIDParent);

如果这种方法提供了所需的结果,但您仍然发现它太慢,那么下一个改进将是使用追加查询将[q-one_level_down]的结果持久化到一个本地表中,该本地表的所有四列都已被索引,然后使用它(在这种情况下,您可能希望将其命名为[lt-one_level_down]--“lt”表示“local table”--为了避免混淆。)

[t-Products]吗。请将该字段的
indexed
属性从
No
更改为
Yes(重复项OK),这就是问题所在吗?(很抱歉,不太喜欢它的更改…)哦,如果这很重要,表是链接的,它们“物理上”保留在另一个MDB文件中。请尝试将该字段的
indexed
属性从
No
更改为
Yes(重复项OK)
,看看这是否有助于加快速度。(您必须在表实际驻留的.mdb文件中进行更改。)它不会改变。q-pAssociation4仍然需要10秒才能返回结果(无论是0还是20条记录)。对于下一个查询(q-pAssociation5,6,7),时间会呈指数增长。