1

私は、Oracle 10g DB にリンクされたテーブルを備えた Access 2007 DB フロントエンドを使用するこのフランケンシュタイン アプリケーションを職場で継承しました。

多くのクエリがエラー 3183 で失敗し、一時領域が不足しているとの報告がユーザーから寄せられています。これらの同じクエリは、数週間前に正常に実行されました。

Access が 2 GB の一時ファイルを作成していることを確認しました。これは、システムの一時ディレクトリで許可されている最大容量です。

データを返さないパラメーターを使用してクエリを実行しても、エラーが発生します。SQL トレースを実行すると、一部のクエリが約 1,400 万行を返すクエリセットを実行しようとしていることがわかります。一部のクエリの設計が不十分であることは知っていますが、それを変更するのは簡単なことではありません。

Oracle DBA に一時スペースを 2 倍にしてもらいましたが、それでも問題は解決しませんでした。

私の質問は、Access DB が最初にリンクされた ODBC データベースで利用可能な一時スペースを使用し、次に Oracle 一時テーブルスペースが利用できない場合に一時ファイルを使用することだと思いますか? なぜこれが起こり始めたのか、それとも単に 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 エンジンは、ワーク セット用の領域が必要な場合、一時ディスク ファイルを使用します。このファイルのサイズは、通常の Access db ファイルと同じように最大 2 GB に制限されています。

どうやら、Access db エンジンは Oracle から非常に多くのデータを取得する必要があるため、その作業セットのスペース要件は 2 GB を超えます。私の推測では、行が一致しないようにクエリの制約を調整した場合でも、Access は最初に中間セットの大量のデータを取得してからでないと、制約を満たす候補行がないと判断することさえできるため、このようなことが起こると考えられます。

Access が処理する必要があるデータの量を制限する何らかの方法を見つける必要があります。あなたが試みたオラクルの見解は別の問題を引き起こしたので、他に何を提案すべきかわかりません。Oracle クエリからの最終的な結果セットのサイズが適切で、その結果セットを Access 側から読み取り専用として使用できる場合は、Accessパススルー クエリを使用します。これで満足できない場合は、問題のあるクエリの Access SQL を見せて、修正できるかどうかを確認してください。

「なぜこれが起こり始めるのか...」については、おそらくOracleデータの量が時間とともに増加しています。

于 2013-10-08T23:57:58.327 に答える