2017-11-09 3 views
0

実行に約10分かかる次のクエリを参照してください。これは、より速く、主にwhere句の条件を結果を取得するために書き換えることができます...レコードのSQL Server:百万レコードテーブルのデータに基づいてWHERE句を書き換えます

数:

  • 表のtmp_TimeIntervals:1440
  • 表のtmp_Activities:1299688

コード:

ごあいさつ

+4

期待している試合の回数はいくつですか?重複がありますか、1つの試合しか期待していませんか?サンプルデータと望ましい結果が得られます。 –

+3

現在どのインデックスがありますか?クエリプランも良いでしょう。 –

+0

オーバーラッピング間隔を探したいですか? –

答えて

0

次のようにSQLクエリが見えることがあります。

select 
    i.ID, 
    sl.SPID, 
    i.PeriodStart, 
    DATEDIFF(mi, i.PeriodStartUTC, sl.ENDTIME) 
from tmp_TimeIntervals i 
join tmp_Activities sl 
on sl.StartTime <= i.PeriodEndUTC and sl.Endtime > i.PeriodStartUTC 

かつ効率的に実行するために、あなたは間違いなく、インデックスtmp_Activities(StartTime , Endtime, SPID)を必要としています。 SPIDは、クラスタ化インデックスのキーであれば削除できます。

create index ix_tmp_Activities on tmp_Activities(StartTime , Endtime) include (SPID) 

別指数tmp_TimeIntervals(PeriodEndUTC, PeriodStartUTC, PeriodStart, ID)は、より簡単に参加するSQL Serverは、マージを使用することができるためにも役立ちます。再度IDは、クラスタード・インデックスのキーであれば、そのインデックスから削除できます。

create index ix_tmp_TimeIntervals on tmp_TimeIntervals(PeriodEndUTC, PeriodStartUTC) include (PeriodStart, ID) 
+0

@ user3657339このアプローチを使用したクエリ処理の結果の時間はどのくらいですか?ありがとう –

0

フレームワークを使用している場合は、組み込みのメソッドを使用してチャンクでレコードを取得します。あなたはtmp_TimeIntervalstmp_Activitiesに重なり合う間隔をしたい場合は

0

推定実行プランをチェックして、アップ噛んでいただきました!コストをチェックするとよいでしょう 物事のカップル。

左外部ジョインを試してください。内側ジョイントよりも高速なサブクエリルックアップが作成されます。 概念はプッシュダウン述語です。

インデックスチェック列の長さを作成する前の別の比較。データの書き込みが頻繁ではない場合、列ストアのインデックスを生成することは、現在のtouのものより10倍高速です。

関連する問題