查询在MS-Access 2010中与较大的表挂起

时间:2016-06-21 20:25:13

标签: ms-access ms-access-2010

Hyper V,
2008 R2
Access 2010
记录数:表1,162,769与表2相关联,40,2262

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)));

查询的剂量较小,但记录量较大。

任何帮助都将不胜感激。

杰夫

2 个答案:

答案 0 :(得分:4)

连接条件中的Right函数(在您的情况下,WHERE子句)导致Access数据库引擎执行重复的表扫描。因此,对于162,000行* 40,000行,您有效地尝试进行~65亿行(6.5E + 9)行比较。

您可能需要在每个表中创建单独的Text(3)字段,使用现有Right( ... , 3)字段中的Text填充它们,对其进行索引,然后将这两个表连接起来那些新领域。

答案 1 :(得分:0)

最佳做法是避免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;