Парадокс производительности запросов: уникальный кластерный или неуникальный некластеризованный индекс
У меня есть стол 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, поэтому второй запрос не требует дополнительных усилий, но первый запрос должен выполнить сортировку по выбранным записям.,