2017-07-31 4 views
3

請求書は日付と番号で連続していなければなりません。私はアウトオブオーダー法案を持っていないことを確認するために、このクエリをやっているが、パフォーマンスがひどいです(私は法案の何百万を持っているので、月を確認するために数分かかります):アウト・オブ・オーダー請求のチェックを最適化できません

SELECT NUMBER, DATE 
FROM BILLS 
WHERE DATE BETWEEN @FROM AND @TO AND 
     EXISTS (SELECT * 
       FROM BILLS OUT_OF_ORDER 
       WHERE OUT_OF_ORDER.NUMBER < BILLS.NUMBER 
       AND OUT_OF_ORDER.DATE > BILLS.DATE) 

すでにNUMBER、DATE、およびDATE + NUMBERのインデックスがありますが、複合インデックスはそのクエリで実際に使用することはできません。

私は、サブクエリを目立たないように削除しようとしました。

SELECT DISTINCT BILLS.NUMBER, BILLS.DATE 
FROM BILLS 
INNER JOIN BILLS OUT_OF_ORDER ON OUT_OF_ORDER.NUMBER < BILLS.NUMBER AND 
           OUT_OF_ORDER.DATE > BILLS.DATE 
WHERE DATE BETWEEN @FROM AND @TO 

は、あなたが(同時に2つの異なるフィールド上> <オペランドを使用して)、クエリのこの種を向上させることができる方法を知っていますか?。

私は実行計画を追加しました。問題は、明らかにOUT_OF_ORDERの請求書をチェックすることです。それは単純なDATEインデックスを使用するだけです。私の知る限り、複合インデックスを定義することはできません。このインデックスでは、2つの異なるフィールドで<オペランドを検索することができます。私は何のギャップを持っていないことを覚えて作ら@Damien_The_Unbeliever

enter image description here

+0

詳細を入力する必要があります。 「パフォーマンスはひどい」とは何ですか?クエリはどのくらい時間がかかりますか?実行プランを試してみてください:https://www.brentozar.com/pastetheplan/ Ps:実行計画を聞くと、管理スタジオはインデックスの作成などを提案していませんか? –

+0

クエリプランがなければ、私たちは推測していますが、 "OUT_OF_ORDER"結合ではほとんどのレコードを考慮する必要があると思います。これをさらに制限する方法はありますか?何十年にもわたって手形が順不同になるか、OUT_OF_ORDER.DATE> BILLS.DATE + 10日間のようなことができますか –

+0

実行計画を追加しました。 1ヶ月間の注文書を計算するのに1分以上かかります。 @NevilleK私は年次シリーズを使用しているので、今年中にそれをさらに制限することができます。 –

答えて

1

(または私は2番目のクエリに検証され、それらを持っているべきではありません)。だから私はただ一つの前の請求書をチェックすることができ、前の請求書のすべてをチェックすることはできません。 1.

は今、このクエリでは、唯一の代わりに数分の数秒かかります - 私は直接請求書番号を探しているので、以前の法案をチェック

は、主キーを使用しています。

SELECT BILLS.NUMBER, BILLS.DATE 
FROM BILLS 
INNER JOIN BILLS OUT_OF_ORDER ON OUT_OF_ORDER.NUMBER = BILLS.NUMBER - 1 AND 
           OUT_OF_ORDER.DATE > BILLS.DATE 
WHERE DATE BETWEEN @FROM AND @TO 

ありがとうございました。

関連する問題