Chr*_*row 2 sql-server execution-plan datetime
我在 SQL 服务器中有以下查询:
declare @timestamp_start date = getdate() - 1
declare @timestamp_end date = getdate()
SELECT
my_date = a.itemTimestamp
FROM
my_table a with(nolock)
WHERE
(@timestamp_start is null OR a.itemTimestamp >= @timestamp_start)
AND (@timestamp_end is null OR a.itemTimestamp < @timestamp_end)
Run Code Online (Sandbox Code Playgroud)
它非常慢(< 2000 条记录为 90 秒),因为执行计划使用 PK 列的聚集索引作为“my_table”:
为什么会发生这种情况以及如何优化查询性能?
itemTimestamp 的数据类型是什么?该列是否已编入索引?该列可以为空吗?
假设答案分别是datetime,是和否,您可能会考虑
WHERE a.itemTimestamp >= isnull(@timestamp_start, '17530101')
AND a.itemTimestamp < isnull(@timestamp_end, '99991231')
Run Code Online (Sandbox Code Playgroud)
如果您要更改datetime2并实际存储 1753 年之前的日期,则需要将下限条件更改为00010101。这也不会带回匹配上界的日期9999-12-31- 但在现实世界中这不太可能引起问题。
| 归档时间: |
|
| 查看次数: |
1639 次 |
| 最近记录: |