【问题标题】:Speed up a select in SQL Server加快 SQL Server 中的选择速度
【发布时间】: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 中的 datehour 组合起来,看看它是否在 table1 DateTimeFromDateTimeTo 之间,那么索引可能没有多大帮助.. 如果您可以组合 @ 987654330@ 和 hour 到单个日期时间列和索引中,你会更好。如果你需要分隔日期和小时,甚至可以在 table2 上计算一个计算日期时间列

标签: sql-server performance indexing


【解决方案1】:

Op(Swapper) - 你想只返回过去 2 天吗?

从表 2 上的非聚集索引开始 date 包括 value 列。

然后添加一个过滤器,只针对你需要的数据集,没有人可以消费 300 万条记录。 where datetimefrom &gt; datediff(month, 1, sysdatetime()) 之类的东西(在视图定义中)

再想一想,为什么要通过视图一遍又一遍地计算这些数据,考虑将这些数据具体化到一个表中。

【讨论】:

  • 他没有生成 300 万行。这是一个聚合。示例结果集只有两行,可供人类使用。
  • 我明白了,出于所有意图和目的,它可能是 3m 条记录,从 Ops 示例中有 5 条记录,3m/5 每天 600k,或 3m/10 每天 300k - 人类无法处理。也可能是3m。如果只返回两条记录,那是没有问题的。
  • 如果不查看工作负载/查询,您怎么可能就索引提出建议????除非你有水晶球什么的:)
猜你喜欢
  • 2022-01-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-09-23
  • 1970-01-01
  • 1970-01-01
  • 2019-07-24
相关资源
最近更新 更多