其中 isnull (DateX, DateY) >= getdate()
where isnull (DateX, DateY) >= getdate()
谁能告诉我提高下面 SQL 性能的方法?
select A, B from T_XXX
where isnull(DateX, DateY) >= getdate()
- DateX 或 DateY 均无索引。
- 目前没有关于DateX中NULL值和非NULL值比例的信息。
(已添加评论)
感谢您的答复!如果你把"No Indexes"作为先决条件,那么SQL有没有改进的空间?
提高性能的最简单方法是在 ISNULL(DateX, DateY)
上创建索引。在 DateX
and/or DateY
上设置单独的索引可能无济于事,因为 ISNULL
函数可能会否定使用索引的能力。
如果您 did 在任一列上都有索引,您可以将子句重写为
WHERE DateX >= GETDATE() OR (DateX IS NULL AND DateY >= GETDATE())
这可以利用任一索引。
SQL 服务器 可能 在内部将 ISNULL
转换为使用索引的等效子句,但您必须两种方式都尝试看看是否有性能改进可以确定,'
If you consider "No Indexes" as prerequisite, is there any room for improvement of the SQL?
不直接。 SQL 是 声明式的 ,这意味着您可以告诉它您想要什么,它会提出它认为是收集数据的最佳计划。在这种情况下,仅通过更改 SQL 就无法改变性能。
您或许可以通过 UNION 改进这一点:
select A, B from T_XXX
where DateX >= getdate()
UNION
select A, B from T_XXX
where DateY >= getdate() and DateX IS NULL
但您仍然可能需要索引才能从中获得最大收益。
谁能告诉我提高下面 SQL 性能的方法?
select A, B from T_XXX
where isnull(DateX, DateY) >= getdate()
- DateX 或 DateY 均无索引。
- 目前没有关于DateX中NULL值和非NULL值比例的信息。
(已添加评论) 感谢您的答复!如果你把"No Indexes"作为先决条件,那么SQL有没有改进的空间?
提高性能的最简单方法是在 ISNULL(DateX, DateY)
上创建索引。在 DateX
and/or DateY
上设置单独的索引可能无济于事,因为 ISNULL
函数可能会否定使用索引的能力。
如果您 did 在任一列上都有索引,您可以将子句重写为
WHERE DateX >= GETDATE() OR (DateX IS NULL AND DateY >= GETDATE())
这可以利用任一索引。
SQL 服务器 可能 在内部将 ISNULL
转换为使用索引的等效子句,但您必须两种方式都尝试看看是否有性能改进可以确定,'
If you consider "No Indexes" as prerequisite, is there any room for improvement of the SQL?
不直接。 SQL 是 声明式的 ,这意味着您可以告诉它您想要什么,它会提出它认为是收集数据的最佳计划。在这种情况下,仅通过更改 SQL 就无法改变性能。
您或许可以通过 UNION 改进这一点:
select A, B from T_XXX
where DateX >= getdate()
UNION
select A, B from T_XXX
where DateY >= getdate() and DateX IS NULL
但您仍然可能需要索引才能从中获得最大收益。