【问题标题】:Query hangs with larger tables in MS-Access 2010查询在 MS-Access 2010 中因较大的表而挂起
【发布时间】:2016-06-22 16:27:29
【问题描述】:

超级 V,
2008 R2
访问 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)));

查询在较小的剂量下工作,但不适用于大的记录大小。

任何帮助将不胜感激。

杰夫

【问题讨论】:

  • 是 [Linked History Total WO Costs] 查询吗?

标签: ms-access ms-access-2010


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

    最好避免在 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;
    

    【讨论】:

    • 感谢您的所有帮助。我将尝试这两种方法,并让您知道它们是如何工作的。再次感谢。
    猜你喜欢
    • 1970-01-01
    • 2015-10-21
    • 2011-05-06
    • 1970-01-01
    • 1970-01-01
    • 2019-04-20
    • 2023-03-07
    • 2021-04-02
    • 1970-01-01
    相关资源
    最近更新 更多