Null是否导致访问表超过2GB并失败

时间:2018-11-11 23:06:15

标签: sql-server ms-access

我正在将查询从MS Access(办公室365)发送到MS SQL 2016,并且遇到错误,一旦达到2GB的最大大小,正在运行的查询中的临时表会导致MS Access失败。

奇怪的是,这仅在我查询Is Null时发生。

此查询已经使用了很长时间,直到最近一次使用我最近几个月的工作信息更新了基础数据表后才开始失败。

如果我搜索一个值而不是Null,它就可以正常工作。

是什么原因引起的?

我能够验证最近一个月的信息是否正常,并且可以拉出我在单独的查询中加载的所有信息,而不会触发2GB最大大小表问题。

SELECT 
    dbo_FY2018TRD.[ACCOUNT NUMBER], 
    dbo_FY2018TRD.[ACCOUNT SHORT NAME], 
    dbo_FY2018TRD.[ACCOUNT NAME], 
    dbo_FY2018TRD.[ACCOUNT RR], 
    dbo_FY2018TRD.[ACCOUNT RR NAME], 
    dbo_FY2018TRD.[ACCOUNT BKR], 
    dbo_FY2018TRD.[ACCOUNT BKR NAME]
FROM 
    dbo_FY2018TRD LEFT JOIN FullRRTable ON dbo_FY2018TRD.[ACCOUNT RR] = FullRRTable.[RRCode]
WHERE 
    (((FullRRTable.RRCode) Is Null));

注释说明:正在使用的临时表是MS Access创建的通用表。大表dbo_FY2018TRD位于SQL Server中,而FullRRTable位于Access中。我之所以将它们分开,是因为我定期编辑FullRRTable以应用标签,但是dbo_FY2018TRD表除了添加新记录外,绝不可修改。 dbo_FY2018TRD是2700万行乘50列,而FullRRTable是35,000行乘5列。

1 个答案:

答案 0 :(得分:1)

注释显示较小的“临时”表FullRRTable在Access数据库中,而表dbo_FY2018TRD在SQL Server上。由于查询涉及两个位置的表,因此完整查询不能作为传递查询发送到服务器。

对于混合查询,Access本质上必须从服务器表dbo_FY2018TRD中请求所有行,因为它必须在没有服务器索引等好处的情况下在本地执行连接。可能没有优化(或者也许只有一个-一边使用Access表的索引),所以Access会对所有记录组合执行逐行比较。如果您有能力检查来自服务器的记录请求,则可能还会观察到Access多次请求同一行。

2 GB除以dbo_FY2018TRD表的2千7百万条记录,每行大约74个字节,因此绝对可以达到限制。将其分为原始查询的7个字段,每个字段大约10个字节(不包括打包字节)也是一个合理的估算值。


这回答了基本问题“关于什么原因造成的任何想法?” 。对于解决方案,我考虑下载用于联接Access中“临时”表的单个键字段dbo_FY2018TRD.[ACCOUNT RR],然后针对该键运行比较查询表。然后,该查询的结果可用于仅检索不匹配的行。

搜索“访问链接表索引”或“访问链接表混合查询”以获取更多建议,尽管您必须进行挖掘以找到有用的信息。