Парадокс производительности запросов: уникальный кластерный или неуникальный некластеризованный индекс

У меня есть стол MY_TABLE примерно с 9 миллионами строк.

Всего в этой таблице 38 столбцов. Столбцы, которые имеют отношение к моему вопросу:

  • RECORD_ID: тождество, bigint, с уникальным кластерным индексом
  • RECORD_CREATED: datetime, с неуникальным и некластеризованным индексом

Теперь я выполняю следующие два запроса и, естественно, ожидаю, что первый будет выполняться быстрее, потому что данные сортируются по столбцу, который имеет уникальный кластеризованный индекс, но каким-то образом он выполняется в 271 раз (!) Медленнее.

SELECT TOP 1 
    RECORD_ID 
FROM 
    MY_TABLE 
WHERE 
    RECORD_CREATED >= '20140801' 
ORDER BY 
    RECORD_ID

SELECT TOP 1 
    RECORD_ID 
FROM 
    MY_TABLE 
WHERE 
    RECORD_CREATED >= '20140801' 
ORDER BY 
    RECORD_CREATED

Время выполнения составляет 1630 мс и 6 мс соответственно.

Пожалуйста, порекомендуйте.

PS: из-за политики безопасности среды я не вижу план выполнения или использования SQL Profiler,

1 ответ

Решение

В SQL Server есть несколько вариантов выполнения этого запроса. Можно начать с сортировки всех элементов, используя упомянутые вами индексы, а затем отфильтровать все элементы, не соответствующие предложению WHERE. Однако, как правило, быстрее сократить размер набора данных, с которым вы работаете в первую очередь, поэтому вам не нужно сортировать как можно больше элементов.

Таким образом, SQL Server, скорее всего, выберет WHERE фильтр первый. Когда он делает это, он, скорее всего, начинает с использования неуникального некластеризованного индекса на RECORD_CREATED, чтобы пропустить все элементы, где RECORD_CREATED меньше "20140801", а затем после этого взять все элементы.

На этом этапе все элементы предварительно отсортированы в том порядке, в котором они были найдены в индексе RECORD_CREATED, поэтому второй запрос не требует дополнительных усилий, но первый запрос должен выполнить сортировку по выбранным записям.,

Другие вопросы по тегам