如何使用或条件优化日期范围



我有一个带有两个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))

不知道您还将如何优化它。

我认为查询很好,无法优化。如果要获得更快的查询结果,则需要查看包含日期字段的视图中的表格。

首先将过滤器应用于该表,直到获得可接受的结果为止。常见的建议是确保正确索引这两个字段并通过查询优化器使用。

一旦您对表演感到满意,请查看视图本身。如果您需要提高那里的性能,您可以再次查看与每个表(如果有)应用于每个表(如果有)的过滤器的单个表。如果一切都表现良好,直到将视图放在一起,则可以根据确切情况以几种不同的方式优化视图。如果您要构建报告解决方案,也许以降级的格式(也许是数据仓库)存储数据的"快照",以消除加入。我也喜欢情况时的索引视图。

最新更新