SELECT DISTINCT () - это путь. Проблема заключается в том, что вы достигли критической точки date
индекса , поэтому вместо этого ваш план идет на сканирование кластерного индекса. Смотрите ссылку на статью Кимберли Л. Триппа, что такое «переломный момент».
Вам нужен индекс покрытия:
CREATE INDEX idx_UsageLog_date_user_id ON UsageLog(date) INCLUDE (userID);
Кластерный индекс также будет работать, но имеет и другие побочные эффекты. Если кластерный индекс на date
в порядке с остальными вашими шаблонами доступа к данным, то он лучше, чем предлагаемый мной покрывающий индекс.
Обновление:
Индекс обратного порядка, который вы пробовали на (userID, date)
, также работает, будет искать каждый идентификатор пользователя. На самом деле это лучше, чем (date, userID)
или (date) INCLUDE (userID)
, поскольку он возвращает предварительно отсортированные идентификаторы пользователя, поэтому DISTINCT не вводит дополнительную сортировку.
Тем не менее, я рекомендую перейти по ссылке, которую я разместил, чтобы понять, почему «индекс по каждому отдельному столбцу» не помог.