現在、約 1 億行を含むテーブルで特定の日付の最小 ID を照会しているときに、データベースで奇妙な動作に直面しています。クエリは非常に単純です。
SELECT MIN(Id) FROM Connection WITH(NOLOCK) WHERE DateConnection = '2012-06-26'
このクエリは決して終了しません。少なくとも何時間も実行させました。DateConnection 列はインデックスではなく、インデックスにも含まれていません。したがって、このクエリがかなり長く続く可能性があることは理解できます。しかし、数秒で実行される次のクエリを試しました。
SELECT Id FROM Connection WITH(NOLOCK) WHERE DateConnection = '2012-06-26'
30万行を返します。
私のテーブルは次のように定義されています:
CREATE TABLE [dbo].[Connection](
[Id] [bigint] IDENTITY(1,1) NOT NULL,
[DateConnection] [datetime] NOT NULL,
[TimeConnection] [time](7) NOT NULL,
[Hour] AS (datepart(hour,[TimeConnection])) PERSISTED NOT NULL,
CONSTRAINT [PK_Connection] PRIMARY KEY CLUSTERED
(
[Hour] ASC,
[Id] ASC
)
)
また、次のインデックスがあります。
CREATE UNIQUE NONCLUSTERED INDEX [IX_Connection_Id] ON [dbo].[Connection]
(
[Id] ASC
)ON [PRIMARY]
この奇妙な動作を使用して見つけた解決策の 1 つは、次のコードを使用することです。しかし、このような単純なクエリにはかなり重いように思えます。
create table #TempId
(
[Id] bigint
)
go
insert into #TempId
select id from partitionned_connection with(nolock) where dateconnection = '2012-06-26'
declare @displayId bigint
select @displayId = min(Id) from #CoIdTest
print @displayId
go
drop table #TempId
go
誰かがこの行動に直面したことがありますか?その原因は何ですか? 最小集計はテーブル全体をスキャンしていますか? そして、これがなぜ単純な選択がそうでないのですか?