我有一个带有两个日期时间字段的视图。 我希望在两个日期时间范围匹配两个日期时间字段之间获得结果。
我已经为此编写了一个查询,但我想优化它,查询如下所示。
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'))
答案 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)
该查询很好,在我看来无法优化。如果要获得更快的查询结果,则需要查看包含日期字段的视图中的表。
首先将过滤器应用于该表,直到获得可接受的结果。常见的建议是确保正确索引这两个字段并由查询优化器使用。
一旦您对该性能感到满意,请查看视图本身。如果您需要提高性能,可以再次查看连接在一起的各个表,并将过滤器应用于每个表(如果有)。如果在将视图放在一起之前一切正常,您可以根据具体情况以几种不同的方式优化视图。也许存储一个'快照'如果要构建报告解决方案,则以非规范化格式(可能是数据仓库)的数据来消除联接。当情况正确时,我也喜欢索引视图。