2010-12-08 6 views
0

私は重大な問題に遭遇しています。実行に膨大な時間を要する巨大な微妙なクエリがあります。実際にはアクセスをフリーズし、時々私は、クエリは次のようになり、それを殺さなければならない:アクセスの最適化を選択

SELECT 
    ITEM.*, 
    ERA.*, 
    ORDR.*, 
ITEM.COnTY1, 
(SELECT TOP 1 New FROM MAPPING WHERE Old = ITEM.COnTY1) AS NewConTy1, 
ITEM.COnValue1, 
(SELECT TOP 1 KBETR FROM GEN_KUMV WHERE KNUMV = ERA.DOCCOND AND KSCHL = (SELECT TOP 1  New FROM MAPPING WHERE Old = ITEM.COnTY1)) AS NewCOnValue1 
--... etc: this continues until ConTy40 

FROM 
GEN_ITEMS AS ITEM, 
GEN_ORDERS AS ORDR, 
GEN_ERASALES AS ERA 

WHERE 
ORDR.ORDER_NUM = ITEM.ORDER_NUM AND -- link between ITEM and ORDR 
ERA.concat = ITEM.concat -- link between ERA and ITEM 

クエリが動作しますので、私は、テーブルのスキーマをご提供することはありません、方法があるのならば、私が知りたいことはありますNewConTy1とNewConValue1を別の手法で追加して効率を上げてください。 Con *フィールドが1から40になっているので、ConTy1の横にあるNewConTy1の隣にNewConValue1があり、40まではConValue2の隣にあります。 ConTy#とConTyValue位ITEMS(フィールドの各) NewConty#とNewConValue#はERA

私は本当に私の説明が私の問題を把握するのに十分であると思います

、 (記録の各)で表示していますあなたからみんなをお待ちして

EDIT:

は私が持っているデータの現在のダンプが、後で

EDIT 2を取り外すことになるだろう正確ではありませんので、それはだ、SELECTSでTOP 1を無視します

私のクエリは

おかげ Miloud

+0

問題は不正なデータ構造です。問題を修正し、問題(および必要な回避策)がなくなる。 –

+0

@ David-W-Fentonおそらくあなたはコメントを読む機会を得られなかったでしょうか? – Fionnuala

+0

コメントはありますか?私は、SQLで明らかな非常に悪い構造上の問題に対処するものは何も見ません。 –

答えて

3

はあなたがアイテムを正常化するために、ユニオンクエリを考えがあります笑また、230のフィールドまで戻りますもう一つは?

SELECT "ConTy1" As CTName, Conty1 As CTVal, 
     "ConTyValue1" As CTVName, ConTyValue1" As CTVVal 
     FROM ITEMS 
UNION ALL 
SELECT "ConTy2" As CTName, Conty2 As CTVal, 
     "ConTyValue2" As CTVName, ConTyValue2" As CTVVal 
     FROM ITEMS 
<...> 
UNION ALL 
SELECT "ConTy40" As CTName, Conty40 As CTVal, 
     "ConTyValue40" As CTVName, ConTyValue40" As CTVVal 
     FROM ITEMS 

これは、メインクエリにリンクする別のクエリか、メインクエリのサブクエリ(より便利な場合)のどちらかになります。それでは、ERAのNewConty#とNewConValue#との関係を描くだけで十分です。

+0

Remou、あなたは世界の赤ちゃんの男の子をロック!ありがとう、私は実行時間を1000分の1のヒントのために、非常にありがとう!今私は1分以内に結果を得る! – CoolStraw

0

Remouの答えは、あなたが望むものを与える - 著しく異なるアプローチ。私はMS Accessクエリの最適化とmeddledてきたし、そのプランナーの詳細を忘れていたので、それはしばらくしているが、あなたは実際に作るために些細な提案をしようとする場合がありますあなたの

WHERE conditions 

INNER JOIN ON conditions 

相関関係のある40個のサブクエリを試しているので、上記のことは役に立たないでしょう(Remouの答えにはかなり異なるアプローチがありますが、本当に改善が見られるかもしれません)。しかし、テストするのは簡単ではありません。

あなたが取ることができるもう1つのアプローチは、高価な部分を具体化し、Remouのアイデアを取ることですが、直接参加できる別の部分に分割します。

たとえば、最初のサブクエリはITEM.COnTY1に関連付けられ、2番目のサブクライブはERA.DOCCONDおよびITEM.ConTY1に関連付けられます。

サブクエリを相関キーに従って分類すると、それらをクエリとして保存したり、メークテーブルクエリとして実現したりすることができます(新しく作成されたテーブルなど)。 の方がはるかに速く、マテリアライゼーションを犠牲にして実行されます。最新のデータを取得する前にいくつかのクエリを実行する必要があります。これはマクロまたはVBA関数/サブでカプセル化できます。

(たとえば、通常のビジネスユースケースの一部として上記のクエリを定期的に実行する場合など) - DBを再設計します。

+0

あなたのヒントもありがとう、本当にレムウは良い方向を指摘しました。そして、それはテスト目的のための日常のビジネスで使用するデータベースです、入力はダンプファイルなので、データベースや何か(タイムラインのため)を再設計する方法はありませんが、今はうまくいくはずです:)。 – CoolStraw

+0

ようこそ。ちょうどメモ - あなたの入力がダンプファイル(非常に正確ではない)であれば、おそらく事を再設計するあらゆる機会があります。:)時間制約があるなら、 – Unreason

関連する問題