where isull(DateX,DateY)> = getdate()

时间:2017-02-23 01:54:19

标签: sql sql-server tsql sql-tuning

有谁能告诉我提高SQL性能的方法?

select A, B from T_XXX
where isnull(DateX, DateY) >= getdate()
  • DateX或DateY上没有索引。
  • 目前没有关于DateX中NULL和非NULL值的比例的信息。

(补充评论) 谢谢你的回复!如果你考虑"没有索引"作为先决条件,是否还有改进SQL的空间?

2 个答案:

答案 0 :(得分:2)

提高性能的最简单方法是在ISNULL(DateX, DateY)上创建索引。在DateX和/或DateY上设置单个索引可能无济于事,因为ISNULL函数可能会否定使用索引的能力。

如果 在任一列上都有索引,则可以将该子句重写为

WHERE DateX >= GETDATE() OR (DateX IS NULL AND DateY >= GETDATE())

可以利用任何一个索引。

SQL Server 可能在内部将ISNULL转换为使用索引的等效子句,但您必须以两种方式尝试并查看是否存在性能改进一定,“

  

如果您认为“无索引”为先决条件,那么SQL还有改进的余地吗?

不直接。 SQL是声明性,这意味着您可以了解自己想要的内容,并提出它认为是收集数据的最佳计划。在这种情况下,只需通过更改SQL就可以做到改变性能。

答案 1 :(得分:1)

您可以通过UNION改善这一点:

select A, B from T_XXX
where DateX >= getdate()

UNION

select A, B from T_XXX
where DateY >= getdate() and DateX IS NULL

但你仍然可能需要索引才能从中获得最大收益。