SQL Server 2016でdatetime列のwhere句とorder by句を同時に指定すると100倍以上遅くなる
一部名前を変え忘れた箇所があったので質問を上げなおしました。申し訳ございません。
logsテーブル 500万行 30列くらい
logs_subテーブル 500万行 20列くらい logsテーブルと1対0または1
上記のテーブルから一定の期間のレコードを取得するため
datetime型(datetime2ではない)の列で検索を行う必要があるのですが、
where句とorder by句を同時に指定すると100倍以上遅くなります。
--遅くない
select *
from logs l
left join logs_sub ls
on l.logdate = ls.logdate
and l.id1 = ls.id1
and l.id2 = ls.id2
and l.id3 = ls.id3
and l.id4 = ls.id4
where logdate between @start and @end
--遅くない
select *
from logs l
left join logs_sub ls
on l.logdate = ls.logdate
and l.id1 = ls.id1
and l.id2 = ls.id2
and l.id3 = ls.id3
and l.id4 = ls.id4
order by logdate
--100倍以上遅い
select *
from logs l
left join logs_sub ls
on l.logdate = ls.logdate
and l.id1 = ls.id1
and l.id2 = ls.id2
and l.id3 = ls.id3
and l.id4 = ls.id4
where logdate between @start and @end
order by logdate
テーブル定義
CREATE TABLE [dbo].[logs](
[logdate] [datetime] NOT NULL,
[id1] [nvarchar](100) NOT NULL,
[id2] [int] NOT NULL,
[id3] [int] NOT NULL,
[id4] [int] NOT NULL,
--ほかいろいろ
CONSTRAINT [pk] PRIMARY KEY CLUSTERED
(
[logdate] ASC,
[id1] ASC,
[id2] ASC,
[id3] ASC,
[id4] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]
CREATE TABLE [dbo].[logs_sub](
[logdate] [datetime] NOT NULL,
[id1] [nvarchar](100) NOT NULL,
[id2] [int] NOT NULL,
[id3] [int] NOT NULL,
[id4] [int] NOT NULL,
--ほかいろいろ
CONSTRAINT [pk] PRIMARY KEY CLUSTERED
(
[logdate] ASC,
[id1] ASC,
[id2] ASC,
[id3] ASC,
[id4] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]
- 今よりも速く、datetime列でソートされた値を取得する必要があります。
- 検索結果が100万件以上になることもありますが、そのすべてを取得する必要があります。
- インデックスを追加することはできません。
クライアント側でソートを行う以外にできることはありますか?