SQL Сервер: индекс для поиска последнего значения, которое больше переданного значения - PullRequest
0 голосов
/ 04 февраля 2020

У меня есть таблица с 4 столбцами

  • USER_ID: цифра c
  • EVENT_DATE: дата
  • ВЕРСИЯ: дата
  • SCORE : десятичное число

У меня есть кластерный индекс (USER_ID, EVENT_DATE, VERSION). Эти три значения вместе являются уникальными.

Мне нужно получить максимум EventDate для набора UserId с (~ 1000 различных идентификаторов), где Score больше указанного значения c и рассматривать только те записи с указанным c Version.

SELECT M.*
FROM (VALUES 
        (   5237    ),
        ………1000 more
        (   27054   ) ) C (USER_ID)
CROSS APPLY 
    (SELECT TOP 1 C.USER_ID, M.EVENT_DATE, M.SCORE
     FROM MY_HUGE_TABLE M                   
     WHERE C. USER_ID = M. USER_ID 
       AND M.VERSION = 'xxxx-xx-xx' 
       AND M.SCORE > 2 --Comment M.SCORE > 2
     ORDER BY M.EVENT_DATE DESC) M

. После выполнения запроса я получаю плохие результаты в отношении времени выполнения из-за отсутствия индекса в столбце оценки (полагаю, ).

Если я удаляю фильтрацию в «M.SCORE> 2», я получаю свои результаты в десять раз быстрее, тем не менее, последние результаты могут быть меньше «2».

Может кто-нибудь пожалуйста подскажите, как настроить индекс, который позволит мне повысить производительность запросов.

Заранее большое спасибо

1 Ответ

1 голос
/ 04 февраля 2020

Для вашего запроса оптимальный индекс будет на (User_ID, Version, ValueDate desc, Score).

К сожалению, ваш кластерный индекс не совпадает. Только первый и третий столбцы совпадают, но они должны совпадать по порядку. Таким образом, только User_ID может помочь, но это, вероятно, не слишком много для фильтрации данных.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...