我在工作中继承了这个弗兰肯斯坦应用程序,该应用程序利用了 Access 2007 DB 前端,其中包含指向 Oracle 10g DB 的链接表。
用户已开始报告许多查询失败,临时空间不足时出现错误 3183。几周前,这些相同的查询运行良好。
我验证了 Access 正在创建一个 2GB 的临时文件,这是系统临时目录中允许的最大数量。
即使我使用不会返回数据的参数运行查询,我仍然会收到错误。执行 SQL 跟踪显示,某些查询正在尝试运行将返回大约 1400 万行的查询集。我知道有些查询设计得很差,但这不是一件容易改变的事情。
我让Oracle DBA将临时空间增加了一倍,但仍然没有解决问题。
我想我的问题是,如果没有可用的 Oracle 临时表空间,Access DB 是否首先使用链接的 ODBC 数据库上可用的临时空间,然后使用临时文件?知道为什么会开始发生这种情况,或者只是 Oracle 数据库中的数据量超出了 Access 的能力?创建应用程序的方式一直工作到几周前左右。
了解重新设计此应用程序并非易事。我更想了解为什么这在以前会起作用并且最近开始发生。
这是访问原始SQL。明白我没有写这个..甲骨文表至少没有空间和与号。:)
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"));
这是AccessError(3183)
的错误描述:
无法完成查询。查询结果的大小大于数据库的最大大小 (2 GB(,或者磁盘上没有足够的临时存储空间来存储查询结果。
当 Access 数据库引擎需要为其工作集留出空间时,它会使用临时磁盘文件。 该文件的大小限制为最大 2 GB,与常规 Access db 文件相同。
因此,显然 Access 数据库引擎必须从 Oracle 提取大量数据,以至于其工作集空间要求超过 2 GB。 我的预感是,即使您调整查询约束以没有匹配的行,也会发生这种情况,因为 Access 必须先为中间集拉取如此多的数据,然后才能确定没有一个候选行满足约束。
您需要找到某种方法来限制 Access 必须处理的数据量。 由于您尝试的 Oracle 视图产生了不同的问题,我不知道还有什么建议。 如果 Oracle 查询的最终结果集大小合理,并且您可以从 Access 端将结果集用作只读,请使用 Access 传递查询。 如果这不令人满意,请向我们展示问题查询中的 Access SQL,看看我们是否可以修复它。
关于"为什么会开始发生这种情况的任何想法......">,很可能 Oracle 数据量随着时间的推移而增长。