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)));
查询的剂量较小,但记录量较大。
任何帮助都将不胜感激。
杰夫
答案 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;