В приложении, которое мы разрабатываем, есть сценарий, когда хранимая процедура вызывается для запроса сеанса. В ореховой оболочке этот SP проверяет сеанс на основе входного параметра и удаляет сеанс if (извлечение из спецификаций)
- Логика
- Удалить строку сеанса, в которой существуют следующие условия:
- Срок действия строки сеанса не истек (
EXPIRES > SYSUTCDATETIME()
).
Вот код для выполнения этой задачи:
DELETE SESSIONS
WHERE SESSION_ID = @p_session_id
AND EXPIRES > SYSUTCDATETIME();
Столбец SESSION_ID
является PK и имеет кластерный индекс по умолчанию. Тип данных является уникальным идентификатором. EXPIRES
имеет тип данных datetimeoffset(0)
.
Вот проблема - SQL Server выполняет CONVERT_IMPLICIT
, и это вызывает сканирование индекса. Чтобы добавить к моим страданиям, клиент отказывается делиться метаданными о БД, и я понятия не имею, сколько строк данных будет иметь рабочая версия. Заказчик считает, что код должен быть максимально эффективным, независимо от конечного размера БД.
Есть ли способ решить эту проблему, кроме использования CAST для явного преобразования SYSUTCDATETIME()
в datetimeoffset(0)
?
Спасибо
Raj