0

私はテーブルCustomer_AJ(顧客varchar、アイテム番号、購入日時)を持っていますが、私はそれを持つ2つのテーブルがあり、失敗と失敗し、その顧客のために次の30分で。Azure SQLデータベース左結合150万レコードのループ

with Failure as (
     select * from [dbo].[Customer_AJ] where item in (20, 34, 35, 36, 37, 47, 53, 54) 
     )  , 
success as (
    select * from Customer_AJ where Item in (1, 3, 40, 42, 43, 5) 
     )  , 
final as (
     select f.customer, f.item,f.purchase from Failure f left outer join success s 
     on f.customer = s.customer and DATEDIFF(minute , f.purchase , s.purchase) between 0 and 30 
     where s.customer is NULL   
     ) 
    select * from final 

Here is the Query Execution plan for it

+1

ライブクエリ統計のスクリーンショットではなく、実際の実行計画XMLを過ぎてhttps://www.brentozar.com/pastetheplan/に移動し、質問へのリンクを追加します。 –

答えて

1

..私はそれが存在していない使用してBYSみましたが、私はクエリ実行計画でそれを見たように、それはIAMのは、実行計画のクエリやスクリーンショットを取り付け、(hashMatchでループなっています何百万行もあれば、毎回遅くなるでしょう。その関数を適用せずにデータを結合する方法を見つける必要があります。

イメージではなく、完全な実行計画で追加の提案が可能である可能性があります。

+0

には、datediff関数を削除する方法があります。特にこの条件付き結合? –

+0

私はこれを推進しているビジネスルールを知らないが、日付と時刻の値を変数として計算し、各列のその変数と比較することがその方法の1つになります。もしルールが他のものから30分離れているものを見つけるのであれば、そのクエリのWHERE、ONまたはHAVING節で計算なしでその値を取り込む方法を見つけ出します。 –

0

個人的には、存在しないものを探すときは、私は '明らかな' WHERE NOT EXISTS()の構文を使用することを好みます。クエリオプティマイザは、LEFT OUTER JOIN ... WHERE field IS NULL構文と同じプランを使用しますが、読みやすくなります。

SELECT f.customer, f.item, f.purchase 
    FROM Failure f 
WHERE NOT EXISTS (SELECT * 
         FROM Success s 
        WHERE s.customer = f.customer 
         AND DATEDIFF(minute , f.purchase , s.purchase) between 0 and 30) 

DateDiff()が一致するデータへの迅速なパスを取得する方法はありません、またオプティマイザは、多くの行が一致するかを予測することができ、ここで、パフォーマンスキラーです。 customer, item, purchaseこれはFailureSuccessかなり速い間の結合を行う必要があります:あなたは、次のフィールドがあり、あなたのCustomer_AJテーブルにインデックスを持っていると仮定すると

SELECT f.customer, f.item, f.purchase 
    FROM Failure f 
WHERE NOT EXISTS (SELECT * 
         FROM Success s 
        WHERE s.customer = f.customer 
         AND s.purchase >= f.purchase 
         AND s.purchase <= DateAdd(minute, +30, f.purchase)) 

:この問題を回避するには、DateAdd()建設にDateDiff()を変換しようとするかもしれません。

(フィールドの順序は、データの外観に少し依存しますが、実際にはpurchaseの列に一致する範囲がありますそれを最後に保つ)。

関連する問題