Эффект CONVERT_IMPLICIT - PullRequest
       2

Эффект CONVERT_IMPLICIT

0 голосов
/ 21 января 2012

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

1 Ответ

1 голос
/ 21 января 2012

Может быть, будет лучше:

DELETE SESSIONS
WHERE SESSION_ID = @p_session_id
  AND EXPIRES > SYSDATETIMEOFFSET();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...