このクエリ01:30
の実行には約時間がかかります。
select DATEADD(dd, 0, DATEDIFF(dd, 0, t1.[OccurredOn]))
, count(t2.UserId)
, count(*) - count(t2.UserId)
from Events t1
left join (select c.UserId, min(c.OccurredOn) FirstOccurred
from Events c
where [OccurredOn] between @start and @end
group by c.UserId) t2 on t1.OccurredOn = t2.FirstOccurred and t1.UserId = t2.UserId
where t1.EventType = @eventType
and t1.[OccurredOn] between @start and @end
group by DATEADD(dd, 0, DATEDIFF(dd, 0, t1.[OccurredOn]))
order by DATEADD(dd, 0, DATEDIFF(dd, 0, t1.[OccurredOn]))
サブクエリから句を削除すると、WHERE
すぐに実行されます。
WHERE
テイク < 1でサブクエリを単独で実行する
最初にテーブル変数にSELECT
サブクエリを実行し、それに結合すると、クエリ全体が 19 秒で実行されます。
Events
表は次のようになります。
[Events](
[EventType] [uniqueidentifier] NOT NULL,
[UserId] [uniqueidentifier] NOT NULL,
[OccurredOn] [datetime] NOT NULL,
)
次のprimary, nonclustered, nounique
インデックスがあります。
- イベントタイプ
- ユーザーID
- 発生日
実行計画はこちら
SQL Server 2008 を使用しています。
2つのこと:
- これを遅くするために何が起こっていますか?
- どうすれば高速化できますか?