У меня есть таблица 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 мс соответственно.
Пожалуйста, порекомендуйте.
P.S.: Из-за политики безопасности среды я не могу видеть план выполнения или использовать SQL Profiler
.
RECORD_CREATED >= '20140801
может быть удовлетворен поиском диапазона. Нахождение соответствующей точки в указателе и последующее его сканирование. Поскольку вам просто нужна первая 1 в порядке индекса, SQL Server может остановить поиск диапазона, как только он прочитает первую строку. Ваш список выбора фактически находится в другом столбцеrecord_id
, но он также автоматически включается в некластеризованный индекс, поскольку он является ключом кластеризованного индекса. - person Martin Smith   schedule 10.09.2014