【发布时间】:2018-07-12 04:15:09
【问题描述】:
我有一个具有以下值的表:
表 1:
Name | DateTimeFrom | DateTimeTo
A | 2017-02-03 02:00 | 2017-02-10 23:55
B | 2017-01-03 14:00 | 2017-05-10 19:55
还有另一个具有这些值的表:
表2:
Name | Date | Hour | Value
A | 2017-01-01 | 00:00 | 0.25
A | 2017-01-01 | 00:15 | 0.25
A | 2017-01-01 | 00:30 | 0
A | 2017-01-01 | 00:45 | 0
A | 2017-01-01 | 01:00 | 0.25
[...] 每 15 分钟包含值 0 或 0.25
结果:
Name | DateTimeFrom | DateTimeTo | Value
A | 2017-02-03 02:00 | 2017-02-10 23:55 | 345.0
B | 2017-01-03 14:00 | 2017-05-10 19:55 | 1202
根据表 1 的日期范围,我创建了一个视图,其中包含表 1 中的所有列以及表 2 中所有值的总和。问题是表 2 包含超过 300 万行和SELECT 大约需要 10 分钟...
有没有办法加快这个过程? 我试图在表 2 上创建一个索引,但我不知道我必须创建哪个索引(聚集?在哪些列上?)以降低执行时间。
编辑(这里是查询):
SELECT Name, DateTimeFrom, DateTimeTo FROM Table1
LEFT OUTER JOIN Table2 ON Table1.Name = Table2.Name AND Table1.DateTimeFrom <=
CAST(Table2.Date AS DATETIME) + CAST(Table2.Hour AS DATETIME)
AND (CASE WHEN Table1.DateTimeTo IS NULL THEN GETDATE() ELSE
Table1.DateTimeTo END) > CAST(Table2.Date AS DATETIME) + CAST(Table2.Hour AS DATETIME)
【问题讨论】:
-
添加视图的脚本
-
发布您的查询,以便有人可以帮助您。如果您不发布,我们怎么知道您的查询出了什么问题????
-
可以包含sql吗?你看过你的执行计划吗?所示的表 2 可能不适合聚集索引。阅读这个简短的概述:technet.microsoft.com/en-us/library/ms190457(v=sql.110).aspx 从这里没有查询,您需要为您的日期字段和值字段提供一个覆盖索引,或者在日期字段上至少需要一个包含值列的索引
-
也添加您的查询,如果发布了查询,将更容易就索引向您提供建议。
-
如果您将 table2 中的
date和hour组合起来,看看它是否在 table1DateTimeFrom和DateTimeTo之间,那么索引可能没有多大帮助.. 如果您可以组合 @ 987654330@ 和hour到单个日期时间列和索引中,你会更好。如果你需要分隔日期和小时,甚至可以在 table2 上计算一个计算日期时间列
标签: sql-server performance indexing