我有一个带有两个DateTime字段的视图。我想在两个日期范围之间与两个DateTime字段中的任何一个匹配之间的结果。
我已经为此写了一个查询,但我想优化,查询如下所示。
SELECT *
FROM viewName
WHERE country = 'India'
AND ((dateTimeFieldFirst BETWEEN '2016-06-20 16:42:39'
AND '2016-06-20 16:52:39')
OR (dateTimeFieldSecond BETWEEN '2016-06-20 16:42:39'
AND '2016-06-20 16:52:39'))
尝试使用 UNION
:
SELECT *
FROM viewName
WHERE country = 'India'
AND ((dateTimeFieldFirst BETWEEN '2016-06-20 16:42:39'
AND '2016-06-20 16:52:39')
UNION
SELECT *
FROM viewName
WHERE country = 'India'
AND ((dateTimeFieldSecond BETWEEN '2016-06-20 16:42:39'
AND '2016-06-20 16:52:39')
如果您知道只有其中一列(dateTimeFieldFirst ,dateTimeFieldSecond )
可以回答条件,请将其更改为UNION ALL
,它应该更快。
另外,如果尚不存在,则添加适当的索引(如果可能的话)(取决于您是否正在计算视图中的列):
(country,dateTimeFieldFirst)
(country,dateTimeFieldSecond)
您可以尝试设置变量。
declare @date1 datetime = '2016-06-20 16:42:39'
declare @date2 datetime = '2016-06-20 16:52:39'
SELECT *
FROM viewName
WHERE country = 'India'
AND ((dateTimeFieldFirst BETWEEN @date1
AND @date2)
OR (dateTimeFieldSecond BETWEEN @date1
AND @date2))
不知道您还将如何优化它。
我认为查询很好,无法优化。如果要获得更快的查询结果,则需要查看包含日期字段的视图中的表格。
首先将过滤器应用于该表,直到获得可接受的结果为止。常见的建议是确保正确索引这两个字段并通过查询优化器使用。
一旦您对表演感到满意,请查看视图本身。如果您需要提高那里的性能,您可以再次查看与每个表(如果有)应用于每个表(如果有)的过滤器的单个表。如果一切都表现良好,直到将视图放在一起,则可以根据确切情况以几种不同的方式优化视图。如果您要构建报告解决方案,也许以降级的格式(也许是数据仓库)存储数据的"快照",以消除加入。我也喜欢情况时的索引视图。