一部名前を変え忘れた箇所があったので質問を上げなおしました。申し訳ございません。

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万件以上になることもありますが、そのすべてを取得する必要があります。
  • インデックスを追加することはできません。

クライアント側でソートを行う以外にできることはありますか?