我有一个带有多个表的 SQL Server 2005 数据库。其中一张表用于存储多个设备的时间戳和消息计数器,并具有以下列:
CREATE TABLE [dbo].[Timestamps] (
[Id] [uniqueidentifier] NOT NULL,
[MessageCounter] [bigint] NULL,
[TimeReceived] [bigint] NULL,
[DeviceTime] [bigint] NULL,
[DeviceId] [int] NULL
)
Id
DeviceId
是唯一的主键 (Guid.Comb),我在和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
6,500,000 行是一个非常奇怪的数字,因为我的select count(*)
查询为设备 1 返回了大约 300,000 行!