Я столкнулся с чем-то неожиданным в SQL Server 2012.
Пытаясь реализовать разбиение на страницы для унаследованного API, я обнаружил, что ROW_NUMBER() OVER
с одним столбцом ORDER BY
довольно медленно работает с большим набором данных.
Я должен предварить это, сказав, что у меня нет доступа к планам выполнения или статистике индекса.
Возможно, мне удастся обойти их в нашей непроизводственной среде, но количество записей там намного ниже, поэтому я не уверен, что это будет полезно.
SELECT
a.Erp_PK
FROM
(SELECT
ROW_NUMBER() OVER(ORDER by Erp_RowGUID asc) AS Row#,
Erp_PK
FROM
Erp
JOIN
Emp ON Emp_PK = Erp_EmpFK
WHERE
Emp_CompanyFK = 2611) a
WHERE
Row# BETWEEN 399001 AND 400000
Таблица Erp
содержит более 32 000 000 записей, а внутреннее предложение where возвращает более 440 000.
Я не знаю, почему человек, создавший API, решил заказать по GUID
, но этот столбец имеет неуникальный некластеризованный индекс.
Вышеуказанный запрос выполняется примерно через 30 секунд.
Попробовав несколько вещей, я обнаружил, что добавление Erp_LastModified
(также с неуникальным некластеризованным индексом) в качестве вторичной сортировки сокращает время запроса до 1 секунды.
Время запроса увеличилось до 30 секунд с одним ORDER BY
из Erp_LastModified
. Затем вернитесь к 2 секундам с помощью CAST
(Exp_RowGUID as VARCHAR(100)
).
Я ищу не столько решение, сколько какое-то представление о том, что здесь происходит.
Все это заставляет меня задуматься о здоровье наших индексов, к которым у меня, опять же, ограничен доступ.
Спасибо.