請求書は日付と番号で連続していなければなりません。私はアウトオブオーダー法案を持っていないことを確認するために、このクエリをやっているが、パフォーマンスがひどいです(私は法案の何百万を持っているので、月を確認するために数分かかります):アウト・オブ・オーダー請求のチェックを最適化できません
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
詳細を入力する必要があります。 「パフォーマンスはひどい」とは何ですか?クエリはどのくらい時間がかかりますか?実行プランを試してみてください:https://www.brentozar.com/pastetheplan/ Ps:実行計画を聞くと、管理スタジオはインデックスの作成などを提案していませんか? –
クエリプランがなければ、私たちは推測していますが、 "OUT_OF_ORDER"結合ではほとんどのレコードを考慮する必要があると思います。これをさらに制限する方法はありますか?何十年にもわたって手形が順不同になるか、OUT_OF_ORDER.DATE> BILLS.DATE + 10日間のようなことができますか –
実行計画を追加しました。 1ヶ月間の注文書を計算するのに1分以上かかります。 @NevilleK私は年次シリーズを使用しているので、今年中にそれをさらに制限することができます。 –