いくつかのテーブルを持つSQLServer2005データベースがあります。テーブルの1つは、複数のデバイスのタイムスタンプとメッセージカウンターを格納するために使用され、次の列があります。
CREATE TABLE [dbo].[Timestamps] (
[Id] [uniqueidentifier] NOT NULL,
[MessageCounter] [bigint] NULL,
[TimeReceived] [bigint] NULL,
[DeviceTime] [bigint] NULL,
[DeviceId] [int] NULL
)
Id
は一意の主キー(Guid.Comb)であり、と列の両方にインデックスがDeviceId
ありMessageCounter
ます。
私がやりたいのはMessageCounter
、特定のデバイスの最後に挿入された行(最大の行)を見つけることです。
奇妙なのは、デバイス番号のクエリです。4(および1番を除く他のすべてのデバイス)はほぼ瞬時に戻ります。
select top 1 *
from "Timestamps"
where DeviceId = 4
order by MessageCounter desc
しかし、デバイス番号に対する同じクエリ。1は完了するのに永遠にかかります:
select top 1 *
from "Timestamps"
where DeviceId = 1 /* this is the only line changed */
order by MessageCounter desc
最も奇妙なことは、デバイス1の行数がデバイス4よりもはるかに少ないことです。
select count(*) from "Timestamps" where DeviceId = 4
(returns 1,839,210)
select count(*) from "Timestamps" where DeviceId = 1
(returns 323,276).
誰かが私が間違っている可能性があることの手がかりを持っていますか?
[編集]
両方のクエリの実行プランから、デバイス1(下の図)がインデックススキャンではるかに多くの行を作成していることがはっきりとわかります。
デバイス4(上)とデバイス1(下)の実行プランhttp://img295.imageshack.us/img295/5784/execplans.png
違いは、実行プラン図でインデックススキャンノードにカーソルを合わせると次のようになります。
Device 4 Actual Number of Rows: 1
Device 1 Actual Number of Rows: approx. 6,500,000
select count(*)
私のクエリはデバイス1に対して約300,000行を返すため、6,500,000行は非常に奇妙な数です。