2

我有一个简单的数据库,我想做一个简单的查询。

这些是我的数据库表的列:

  • external_id
  • 时间戳
  • 价值
  • 验证
  • 原因
  • 基准
  • 乌尔
  • 阿弗龙登

这些列是:

  • external_id是某个meter的id
  • Timestamp什么也没做
  • Value是那个仪表的值
  • Validation是或不是
  • Reason刚刚得到一个varchar有原因的价值
  • Datum是日期
  • Uur是那个小时
  • Afronden是四舍五入所需的列

我要执行的查询以获取每天值总和的最高值和最低值为目标。

如您所见,每一天都以小时为单位,必须检查或数据是否相同或发生变化并由此获得总值。

这是我的查询:

Declare @totaal bigInt
Declare @tussentotaal bigint
Declare @Datum varchar
Declare @datumverschil varchar
Declare @hoogste bigint
Declare @laagste bigint
Declare @teller bigint
Declare @tellettotaal bigint

set @tellettotaal = (select count(*) from cresent_opdracht_de_proost_wim.dbo.[test])

Set @teller = 1

SET @datum = (Select top(1) datum 
              from cresent_opdracht_de_proost_wim.dbo.[test] 
              order by afronden asc)

Set @datumverschil = @Datum
set @tussentotaal = 0
set @totaal = 0
set @hoogste = 1775000006856
set @laagste = 1775000006856

while @teller <= @tellettotaal
begin
  if @teller = 1
  Begin
    set @tussentotaal = (select top(1) value 
                         from cresent_opdracht_de_proost_wim.dbo.[test] 
                         order by afronden asc)

    if @tussentotaal != 0
    begin
      Set @tussentotaal = @tussentotaal/100
    end
  End
  Else
  begin
    SET @tussentotaal = (Select top(1) value 
                         from (select top (@teller) * 
                               from cresent_opdracht_de_proost_wim.dbo.[test]) q 
                         order by afronden desc)

    Set @tussentotaal = @tussentotaal/100
  end

  if @tussentotaal != 0 
  Begin
    Set @totaal = @totaal + @tussentotaal
  end

  SET @teller= @teller + 1

  Set @datumverschil = (Select top(1) datum 
                        from (select top (@teller) * 
                              from cresent_opdracht_de_proost_wim.dbo.[test]) q 
                        order by afronden desc)

  if @datum != @datumverschil
  Begin
    if @totaal >= @hoogste
    begin
      set @hoogste = @totaal
    end

    if @totaal <= @laagste
    begin
      if @totaal != 0
      Begin
        set @laagste = @totaal
      end
    end

    Set @datum = @datumverschil
    set @totaal = 0
    select @teller As teller
  end
end

Select @hoogste As hoogste
Select @laagste As laagste

22 分钟后,仅处理了 44000 行。

有人知道我可以如何优化我的查询吗?

4

1 回答 1

1

嗯,有没有想过不使用破碎的程序方法可能是一个想法?

首先,你的逻辑可能被打破了——时间听起来太大了,所以也许你只是有一个死循环。抱歉,大多数人很难理解边缘语言 - 即任何不是英语的东西,所以你的表格和字段名称没有意义。胡说八道很难被不理解它的人调试。

这就是说:我认为你可以通过不在前 1 上运行无意义的循环来减少总的查询次数 - 而是让所有内容按降序排列。残酷地说:摆脱循环并制作一个编译结果集的语句。严重地。这应该是可能的。不要像 20 年前许多人在 dbase 时代所做的那样,试图超越查询优化器并返回编写过程数据库代码。一般来说。您的查询是线性的,这意味着没有并行化,您对条件的微观管理意味着没有查询优化器可以做聪明的事情(因为优化是逐个语句的)。在一个语句中定义结果集,您可能想知道它的效率如何。

我很确定最后你会发现你基本上是在尝试比你编写查询更好的东西。使用 SQL - 定义结果集。

最后,在不知道您的数据分布和 - 哎哟 - 索引的情况下 - 我们真的无能为力。也许您只是错过了任何合理的索引?谁知道——你什么都不告诉我们(没有查询计划输出,没有表定义,没有索引定义)。

它也可能不必滥用数据类型:Declare @Datum varchar - OUCH。听说过 sql server 中的 DATE 数据类型吗?

于 2012-04-30T08:48:27.090 回答