0

ASP.NET MVC3アプリケーションを使用していて、バスの旅のデータベーステーブルがあり、バスの旅の開始日と終了日、および運行日が一覧表示されています。以下にスニペットを示します。

JourneyID   StartDate   EndDate     Monday  Tuesday Wednesday   etc
676         02 Jan 2012 01 Mar 2012 True    False   True        etc
696         02 Jan 2012 01 Mar 2012 False   False   True        etc
650         02 Jan 2012 25 Mar 2012 True    True    True        etc

したがって、2012年1月2日の日付が月曜日であり、月曜日がtrueに設定されている場合、その日に旅があります。

これらを実行する日ごとに新しいテーブル行に挿入しようとしているので、次のようになります。

JourneyID   Date
676         02 Jan 2012
676         04 Jan 2012
696         04 Jan 2012
650         02 Jan 2012
650         03 Jan 2012

現在システム上にあるこれを行うためのクエリは非常に遅く、t-sqlでネストされたwhileループを使用します。C#にもバージョンがありましたが、それは少し遅くなりました-同様のプロセスを使用しましたが(ネストされたループプロセスを使用し、アイテムを保存して汎用リストに挿入し、次にそれらを一括挿入しました)

現在使用中のプロセスは、すべてのジャーニーをループし、各ジャーニー内で、開始日と終了日の間のすべての日付をループして、それが当たる日と、その日がtrueに設定されているかどうかを確認します。これは、実行に長い時間がかかる場合があります。

誰かがこの挿入を実行するためのより効率的な方法を考えることができますか?現在、1時間に約100,000回の移動をループできますが、数百万回の移動が発生する可能性があるため、時間がかかる可能性があります。

4

2 に答える 2

1

事実上、ピボットを解除してからフィルタリングします。

;with cte as
(
    select JourneyID, StartDate,EndDate,Days
    from yourtable s unpivot (active for days in (Monday, tuesday, wednesday, ...)) u
    where active = 1
)
    select JourneyID, JourneyDate
    from (
        select 
            DATEADD(D, number, (Select MIN(startdate) from cte)) as JourneyDate
        from master..spt_values 
        where type='p' 
        and number < (select datediff(d,MIN(StartDate),max(enddate)) from cte)
    ) numbers
        cross join cte
    where 
        days = datename(weekday, JourneyDate) 
        and JourneyDatebetween StartDate and EndDate
    order by JourneyDate, JourneyID
于 2012-10-19T09:39:24.250 に答える
0

カレンダテーブルを作成して結合します。曜日は、テーブル設定の少しトリッキーな原因です(ブール月曜日、火曜日など)。ツアーが実行される日を正規化して子テーブルに抽出すると、はるかに簡単になります。

このような設定では、次のようなクエリを作成できます。

INSERT INTO NewTable (Journey, Date)
SELECT J.JourneyId, C.Date FROM Journey J
INNER JOIN JourneyWeekdays JW ON J.Id = JW.JourneyId
INNER JOIN Calendar C ON (C.Date BETWEEN JT.StartDate AND JT.EndDate) AND C.DayOfWeek = JW.DayOfWeek

適切なインデックスを作成すると、パフォーマンスが向上します。

于 2012-10-19T11:56:53.820 に答える