Ms access 在MS Access 2010中,查询与较大的表挂起

Ms access 在MS Access 2010中,查询与较大的表挂起,ms-access,ms-access-2010,Ms Access,Ms Access 2010,超V, 2008 R2 Access 2010 记录数:表1,162769链接到表2,4022262 MS Access挂起并在锁定前不响应。查询如下: SELECT [Civil Aircraft Registry].[Common Name], [Civil Aircraft Registry].Model, [Linked History Total WO Costs].LastOfPRT, [Linked History Total WO Costs].LastOfUNT,

超V,
2008 R2
Access 2010
记录数:表1,162769链接到表2,4022262

MS Access挂起并在锁定前不响应。查询如下:

SELECT [Civil Aircraft Registry].[Common Name], [Civil Aircraft Registry].Model, 
    [Linked History Total WO Costs].LastOfPRT, [Linked History Total WO Costs].LastOfUNT, 
    [Linked History Total WO Costs].LastOfSVP, [Civil Aircraft Registry].registration, 
    [Linked History Total WO Costs].ARG

FROM [Civil Aircraft Registry], [Linked History Total WO Costs]

WHERE (((Right([Civil Aircraft Registry].[registration],3)) 
        = Right([Linked History Total WO Costs].[ARG],3)));
查询在较小的剂量下工作,但不适用于较大的记录大小

任何帮助都将不胜感激


Jeff

连接条件中的
函数(在您的情况下,WHERE子句)导致Access数据库引擎重复执行表扫描。因此,对于162000行*40000行,您实际上尝试进行约65亿(6.5E+9)行比较


您可能需要在每个表中创建一个单独的
Text(3)
字段,用现有
Text
字段中的
Right(…,3)
填充它们,为它们编制索引,然后在这些新字段上联接两个表。

Right
函数在联接条件下(在您的例子中,WHERE子句)正在导致Access数据库引擎重复执行表扫描。因此,对于162000行*40000行,您实际上尝试进行约65亿(6.5E+9)行比较


您可能需要在每个表中创建一个单独的
Text(3)
字段,使用现有
Text
字段中的
Right(…,3)
填充它们,为它们编制索引,然后在这些新字段上连接两个表。

最好避免在
WHERE
子句中使用函数,它确实会降低性能

当函数位于
WHERE
子句中时,会对结果集中的每条记录调用该函数,这会降低查询性能。这样做还将防止在列上使用任何索引

您可以改为创建计算列:

SELECT [Civil Aircraft Registry].[Common Name], [Civil Aircraft Registry].Model, 
    [Linked History Total WO Costs].LastOfPRT, [Linked History Total WO Costs].LastOfUNT, 
    [Linked History Total WO Costs].LastOfSVP, [Civil Aircraft Registry].registration, 
    [Linked History Total WO Costs].ARG, right([Civil Aircraft Registration],3) AS Reg_3,
    right([Linked History Total WO Costs].ARG,3) AS Arg_3

FROM [Civil Aircraft Registry], [Linked History Total WO Costs]

WHERE Reg_3 = Arg_3;

最好避免使用
WHERE
子句中的函数,这样会降低性能

当函数位于
WHERE
子句中时,会对结果集中的每条记录调用该函数,这会降低查询性能。这样做还将防止在列上使用任何索引

您可以改为创建计算列:

SELECT [Civil Aircraft Registry].[Common Name], [Civil Aircraft Registry].Model, 
    [Linked History Total WO Costs].LastOfPRT, [Linked History Total WO Costs].LastOfUNT, 
    [Linked History Total WO Costs].LastOfSVP, [Civil Aircraft Registry].registration, 
    [Linked History Total WO Costs].ARG, right([Civil Aircraft Registration],3) AS Reg_3,
    right([Linked History Total WO Costs].ARG,3) AS Arg_3

FROM [Civil Aircraft Registry], [Linked History Total WO Costs]

WHERE Reg_3 = Arg_3;

[Linked History Total WO Costs]是查询吗?[Linked History Total WO Costs]是查询吗?感谢您的帮助。我将尝试这两种方法,并让你知道它们是如何工作的。再次感谢,谢谢你的帮助。我将尝试这两种方法,并让你知道它们是如何工作的。再次感谢。