Я таблица большой (> 100 миллионов строк) в моей базе данных MS SQL со следующими столбцами:Форсировочная SQL запросов с агрегатами на DateTime и группы по
Id int not null,
ObjectId int not null,
Timestamp datetime not null
State int not null
Id
это первичный ключ таблицы (и на нем есть кластерный индекс). Я добавил не кластеризованный индекс в Timestamp и ObjectId (в этом порядке). В ObjectId
всего около 2000 различных значений. Я хочу выполнить следующие запросы:
SELECT ObjectId, MAX(Timestamp) FROM Table GROUP BY ObjectId
Это занимает около четырех секунд, что слишком медленно для моего приложения. В плане выполнения говорится, что 97% времени выполнения относится к сканированию индексов некластеризованного индекса.
На копии таблицы я создал кластерный указатель на ObjectId и Timestamp. Результирующая среда выполнения такая же, в плане выполнения говорится, что теперь она выполняет сканирование индексов кластерного индекса.
Есть ли другая возможность улучшить время выполнения без разделения данных таблицы на несколько таблиц?
Вы пробовали указатель только на ObjectID? Хотя я не ожидаю, что это улучшит дело, так как запрос, который вы выполняете, должен касаться каждой строки в базе данных в любом случае. IMO не будет улучшено, если вы не улучшаете свой сервер db или не перепроектируете свою схему (например, вы можете добавить вторую таблицу, которая сохраняет максимальную временную метку для каждого объекта с помощью триггера). – jeroenh
@ jeroenh: Да, я тоже пробовал это без каких-либо замечательных результатов. –
На самом деле мы можем предположить, что вы часто вставляете данные в эту таблицу, возможно, добавляете подсказку в свой запрос: WITH (NOLOCK) –