1

我在工作中继承了这个 Frankenstein 应用程序,该应用程序利用 Access 2007 DB 前端和 Oracle 10g DB 的链接表。

用户已经开始报告许多查询都失败了,并出现错误 3183 out of temporal space。这些相同的查询在几周前运行良好。

我验证了 Access 正在创建一个 2GB 的临时文件,这是系统临时目录中允许的最大数量。

即使我使用不会返回数据的参数运行查询,我仍然会收到错误消息。执行 SQL 跟踪表明,一些查询正在尝试运行一个查询集,该查询集将返回大约 1400 万行。我知道有些查询设计得很糟糕,但这并不是一件容易改变的事情。

我让 Oracle DBA 将临时空间加倍,但仍然没有解决问题。

我想我的问题是,如果没有可用的 Oracle 临时表空间,Access DB 是否首先使用链接的 ODBC 数据库上可用的临时空间,然后使用临时文件?任何想法为什么会开始发生这种情况,或者仅仅是 Oracle 数据库中的数据量超过了 Access 的能力?创建应用程序的方式一直有效,直到几周前左右。

了解重新设计此应用程序并非易事。我更想知道为什么这之前会起作用并且最近开始发生。

这是 Access RAW SQL.. 明白我没有写这个.. Oracle 表至少没有空格和 & 符号。:)

    SELECT DISTINCT [Event: Overhaul & Repair].BASE_PART_NUMBER,
  [Event: Overhaul & Repair].PERIOD,
  [Event: Overhaul & Repair].RECEIVED_BY_FACILITY_DATE,
  [Event: Overhaul & Repair].PART_NUMBER,
  [Event: Overhaul & Repair].CONFIGURATION_RECEIVED,
  [Event: Overhaul & Repair].PART_SERIAL_NBR,
  [Findings: Feature Findings Detail].SUBASSEMBLY_NAME,
  [Findings: Feature Findings Detail].COMPONENT_NAME,
  [Findings: Feature Findings Detail].FEATURE_NAME,
  [Findings: Feature Findings Detail].FAILURE_DESCRIPTION,
  [Findings: Feature Findings Detail].PRIMARY_FAILURE_IND,
  [Event: Overhaul & Repair].REMOVAL_JUSTIFIED_FLAG_ON_OR,
  [Event: Overhaul & Repair].CUSTOMER_NAME_SUBMITTING,
  [Findings: Feature Findings Detail].AIRCRAFT_TYPE,
  [Event: Overhaul & Repair].AIRCRAFT_REG_NUMBER,
  [Event: Overhaul & Repair Text].NOTE_TEXT,
  [Event: Overhaul & Repair].TIME_SINCE_NEW_ON_OR,
  [Event: Overhaul & Repair].TIME_SINCE_INSTALL,
  [Event: Overhaul & Repair].TIME_SINCE_OVERHAUL_ON_OR,
  [Event: Overhaul & Repair].FACILITY_NAME,
  [Event: Overhaul & Repair].EVENT_SEQNO
FROM ([Event: Overhaul & REPAIR]
LEFT JOIN [Event: Overhaul & REPAIR Text]
ON [Event: Overhaul & REPAIR].EVENT_SEQNO=[Event: Overhaul & REPAIR Text].EVENT_SEQNO)
LEFT JOIN [Findings: Feature Findings Detail]
ON [Event: Overhaul & REPAIR].EVENT_SEQNO=[Findings: Feature Findings Detail].EVENT_SEQUENCE_NUMBER
WHERE ((([Event: Overhaul & Repair].BASE_PART_NUMBER)=[PART NUMBER])
AND (([Event: Overhaul & Repair].PERIOD) BETWEEN [START DATE YYYYMM] AND [END DATE YYYYMM])
AND (([Findings: Feature Findings Detail].PRIMARY_FAILURE_IND)="PF"
OR ([Findings: Feature Findings Detail].PRIMARY_FAILURE_IND) IS NULL)
AND (([Event: Overhaul & Repair Text].NOTE_TEXT)="R"));
4

1 回答 1

2

这是错误描述AccessError(3183)

无法完成查询。查询结果的大小大于数据库的最大大小(2 GB),或者磁盘上没有足够的临时存储空间来存储查询结果。

当 Access db 引擎需要为其工作集提供空间时,它会使用一个临时磁盘文件。该文件的大小限制为最大 2 GB,与常规 Access db 文件相同。

因此,显然 Access db 引擎必须从 Oracle 中提取大量数据,以至于其工作集空间要求超过 2 GB。我的预感是即使您调整查询约束以使没有行匹配也会发生这种情况,因为 Access 必须首先为中间集提取大量数据,然后才能确定没有候选行满足约束。

您需要找到一些方法来限制 Access 必须处理的数据量。由于您尝试的 Oracle 视图产生了不同的问题,我不知道还有什么建议。如果 Oracle 查询的最终结果集大小合理,并且您可以从 Access 端将结果集用作只读,则使用 Access pass-through query。如果这不令人满意,请向我们展示问题查询中的 Access SQL,看看我们是否可以修复它。

关于“任何想法为什么会开始发生......”,Oracle 数据量很可能随着时间的推移而增长。

于 2013-10-08T23:57:58.327 回答