在我们正在开发的应用程序中,有一种情况是调用存储过程来声明会话。在坚果shell中,此SP根据输入参数检查会话,并删除会话if(从规范中提取)
EXPIRES > SYSUTCDATETIME()
)。以下是执行此任务的代码:
DELETE SESSIONS
WHERE SESSION_ID = @p_session_id
AND EXPIRES > SYSUTCDATETIME();
SESSION_ID
列是PK并具有默认的聚簇索引。数据类型是uniqueidentifier。 EXPIRES
的数据类型为datetimeoffset(0)
。
问题出在这里 - SQL Server执行CONVERT_IMPLICIT
这会导致索引扫描。为了增加我的痛苦,客户拒绝共享有关数据库的元数据,我不知道生产版本将包含多少行数据。客户认为,无论最终的数据库大小如何,代码都必须尽可能高效。
除了使用CAST进行SYSUTCDATETIME()
到datetimeoffset(0)
的显式转换之外,有没有办法解决这个问题?
谢谢,
拉吉
答案 0 :(得分:1)
可能会更好:
DELETE SESSIONS
WHERE SESSION_ID = @p_session_id
AND EXPIRES > SYSDATETIMEOFFSET();