【问题标题】:How to increase performance of select query if row by row calculation is required?如果需要逐行计算,如何提高选择查询的性能?
【发布时间】:2015-05-29 07:41:13
【问题描述】:

我有一张如下表:

  • PK,
  • 日期,
  • 小时 (0-23),
  • 交易ID(外键),
  • 价格,
  • 音量

每笔交易都有 3 年的数据(365x24x3 = 26280 小时)。而且,我目前有 5000 个(并且还在增长)。

我正在尝试计算每小时(每个 26280)的加权平均值(SUM(P_Transaction1xV_Transaction1+ P_Transaction2xV_Transaction2+ … + P_Transaction5000xV_Transaction5000)/ SUM(V_Transaction1+ V_Transaction2+…+ V_Transaction5000)。

我们尝试了以下选项,但无法显着减少运行时间。

选项 1:

数据表: PK 日期 交易 ID(外键) 价格 1、价格 2、……、价格 24 第 1 卷,第 2 卷,……第 24 卷

索引列:交易 ID、日期 使用了存储过程。

选项 2:

数据表1: PK 日期 小时 (0-23) 交易 ID(外键) 音量

数据表2: PK 日期 小时 (0-23) 交易 ID(外键) 价格

索引列:交易 ID、日期、小时 使用了存储过程。

选项 3: 正如我一开始解释的那样。

我想知道在数据模型、索引等方面是否有更好的方法......为了尽可能提高性能。

【问题讨论】:

  • 选项 1,有 24 个价格栏和 24 个成交量栏,一团糟。避免它!
  • 您使用的是哪个 DBMS!?
  • Microsoft SQL Server 2008 企业版(64 位)
  • 您是否尝试将其表达为单个 SQL 而不是存储过程?有时它可以更快。或者,您可以尝试将临时表用于中间数据并将作业拆分为多个部分,这可能会更快。我会从一个 SQL 开始,看看会发生什么。

标签: sql sql-server performance procedure


【解决方案1】:

由于您试图找出“每小时”的汇总,因此您的起点应该是group by date, hour

select date, hour, sum(price * volume) / sum(volume)
from table
group by date, hour

在(日期、小时)或至少在日期上有一个索引会有所帮助。

【讨论】:

  • 具体:CREATE INDEX ix_temporal ON table (date, hour) INCLUDE (price, volume)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-09-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-01-09
  • 2021-08-26
  • 1970-01-01
相关资源
最近更新 更多