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

时间:2016-06-20 13:18:37

标签: sql sql-server

我有一个带有两个日期时间字段的视图。 我希望在两个日期时间范围匹配两个日期时间字段之间获得结果。

我已经为此编写了一个查询,但我想优化它,查询如下所示。

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'))

3 个答案:

答案 0 :(得分:4)

尝试使用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)

答案 1 :(得分:0)

您可以尝试设置变量。

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))

不知道你会如何优化它。

答案 2 :(得分:0)

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

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

一旦您对该性能感到满意,请查看视图本身。如果您需要提高性能,可以再次查看连接在一起的各个表,并将过滤器应用于每个表(如果有)。如果在将视图放在一起之前一切正常,您可以根据具体情况以几种不同的方式优化视图。也许存储一个'快照'如果要构建报告解决方案,则以非规范化格式(可能是数据仓库)的数据来消除联接。当情况正确时,我也喜欢索引视图。