优化需要很长时间才能执行的SQL查询

时间:2012-04-30 08:18:15

标签: performance sql-server-2012

我有一个简单的数据库,我想在其上进行简单的查询。

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

  • external_id
  • 时间戳
  • 验证
  • 原因
  • 基准
  • Uur
  • Afronden

列是:

  • external_id是某个米的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行。

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

1 个答案:

答案 0 :(得分:1)

嗯,曾经认为不使用破碎的程序方法可能是一个想法吗?

首先,你的逻辑可能会被打破 - 时间太长了,所以也许你只是有一个死循环。对不起,大多数人都很难理解边缘语言 - 即任何不是英语的东西,所以你的桌面和字段名称没有意义。对于不了解它的人来说,废话几乎是不可调试的。

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

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

最后,在不知道您的数据分布和 - ouch - 指数的情况下,我们无法提供帮助。也许你只是错过任何明智的指数?谁知道 - 你不告诉我们任何事情(没有查询计划输出,没有表格定义,没有索引定义)。

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