У меня есть база данных SQL Server 2005 с несколькими таблицами.Одна из таблиц используется для хранения меток времени и счетчиков сообщений для нескольких устройств и имеет следующие столбцы:
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
6 500 000 строк - очень странное число, поскольку мой запрос select count(*)
возвращает около 300 000 строк для устройства 1!