【问题标题】:Fastest way to perform time average of multiple calculations in SQL?在 SQL 中执行多个计算的时间平均值的最快方法?
【发布时间】:2010-09-20 16:49:30
【问题描述】:

我有一个关于在表 TheTable 上执行 SQL Server 查询的最快方法的问题,该表具有以下字段:TimeStamp、Col1、Col2、Col3、Col4
我不维护数据库,我只是可以访问它。我需要执行 10 次类似的计算:

Col2*Col3 + 5       
5*POWER(Col3,7) + 4*POWER(Col2,6) + 3*POWER(Col1,5)       

然后我必须使用选定日期的数据(数据库中到目前为止有 8 个月的数据)找到计算结果的 AVG 和 MAX。由于数据每 0.1 秒采样一次,因此每次计算有 864000 行。我想确保查询尽快运行。有没有比这更好的方法:

SELECT AVG(Col2*Col3 + 5), 
    AVG(5*POWER(Col3,7) + 4*POWER(Col2,6) + 3*POWER(Col1,5)), 
    MAX(Col2*Col3 + 5), 
    MAX(5*POWER(Col3,7) + 4*POWER(Col2,6) + 3*POWER(Col1,5)) 
FROM TheTable 
WHERE TimeStamp >= '2010-08-31 00:00:00:000' 
    AND TimeStamp < '2010-09-01 00:00:00:000'

谢谢!

【问题讨论】:

    标签: sql sql-server time max average


    【解决方案1】:

    您可以将它们创建为计算(计算)列,并将 Is Persisted 设置为 true。这将在插入时将计算的值保存到磁盘,并非常快速地对这些值进行后续查询。

    或者,如果您无法修改表架构,您可以创建一个 Indexed View 来为您计算值。

    【讨论】:

    • 我是 SQL 新手 - 这些列会成为表的永久部分吗?我应该提到这是一个我不维护的数据库。
    • 是的,他们会的。请参阅我的第二个建议。
    • 非常感谢。一旦我学会了如何制作索引视图,我将发布代码。
    【解决方案2】:

    在插入数据而不是选择数据时进行这些计算怎么样?然后,您只需要在给定日期对这些值进行计算。

    TableName
    ---------
     TimeStamp
     Col1
     Col2
     Col3
     Col4
     Calc1
     Calc2
     Calc3
    

    然后像这样插入:

    INSERT INTO TableName (...)
    VALUES
    (...,AVG(@Col2Val*@Col3Val + 5),...)
    

    【讨论】:

    • 这是一个很好的建议,但我应该提到这实际上不是我的数据库,所以我不确定数据库管理员是否希望我更改它。计算也经常发生变化。
    • 好吧,如果您必须进行计算,则必须进行计算。如果您无法在插入时执行此操作,您可以选择在选择时执行此操作,或者在您选择所有内容后在代码中执行此操作。
    【解决方案3】:

    您唯一的选择是提前计算值,Computed Columns 或视图中的持久列,请参阅此处Improving Performance with SQL Server 2005 Indexed Views。如果您无法更改数据库,您可以将该数据库中的数据提取到您自己的数据库中。只需在将列插入自己的数据库时计算列。然后在您自己的数据库上运行您的查询。

    【讨论】:

      猜你喜欢
      • 2013-07-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-02-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多