Вопрос многомерной индексации
Сейчас я создаю таблицу, которая содержит информацию о грузовике сверхурочно,
мой вопрос: Чего я хочу, так это двоякого:
1. напишите запрос, который получит последнюю запись для каждого грузовика (я создаю таблицу прямо сейчас, у меня нет даты, трудно проверить)
2. Убедитесь, что я создаю правильный индекс, который сделает этот запрос быстрым (у меня есть некоторые сомнения в том, что многомерный индекс (дата и truckID) может успешно использовать оператор сравнения)
3. (необязательно) как написать этот запрос с помощью EF
Что я уже пробовал:
Мой стол выглядит так
create table TruckLocation ( ID bigint identity (1, 1), TruckID int not null, timestamp datetime2 not null, -- blablabla other data, ex: latitude real not null, longitude real not null )
И да я тоже использую
geometry
тип, это не мой вопрос.Для текущего местоположения я придумал этот запрос
select * from dbo.TruckLocations LOC where [timestamp] = (select max([timestamp]) from dbo.TruckLocations where TruckID = LOC.TruckID)
кажется, работает...
Но я хочу убедиться, что он работает быстро!
а как насчет этого индекса? (вот в чем настоящий вопрос)
CREATE NONCLUSTERED INDEX [IDX_TRUCKLOCATIONS_TIMESTAMP] ON [dbo].[TruckLocations] ( [TruckID] ASC, [timestamp] desc ) GO
Наконец, как мне написать этот запрос в EF (Entity Framework)?
было бы неплохо избежать хранимой процедуры....
Я придумал это, анализатор запросов, кажется, все в порядке....
var query = from p in db.TruckLocations where p.timestamp == db.TruckLocations.Where(x => x.TruckID == p.TruckID).Max(x => x.timestamp) select p ;
удивительное дело делать
OrderByDescending(timestamp).Take(1)
, но анализатор запросов "выглядит" хуже всего... (не очень хорошо читает анализатор запросов)