Performance 优化执行时间较长的SQL查询

Performance 优化执行时间较长的SQL查询,performance,sql-server-2012,Performance,Sql Server 2012,我有一个简单的数据库,我想在上面做一个简单的查询 以下是“我的数据库”表的列: 外部识别码 时间戳 价值 验证 原因 资料 Uur 阿弗隆 各栏分别为: 外部id是某个仪表的id 时间戳不起任何作用 值是该仪表的值 验证是或不是 Reason刚得到一个带Reason的varchar值 数据是日期 Uur就是那个时刻 Afronden是四舍五入所需的列 我要执行的查询的目标是获取每天值总和的最高值和最低值 如你所见,每天被分成小时,必须检查或数据相同或变化,并由此得到总值 这是我的疑问: Decl

我有一个简单的数据库,我想在上面做一个简单的查询

以下是“我的数据库”表的列:

外部识别码 时间戳 价值 验证 原因 资料 Uur 阿弗隆 各栏分别为:

外部id是某个仪表的id 时间戳不起任何作用 值是该仪表的值 验证是或不是 Reason刚得到一个带Reason的varchar值 数据是日期 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行


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

Hm,有没有想过不使用不完整的程序方法可能是个好主意

首先,你的逻辑可能被打破——时间太长了,所以你可能只是有一个死循环。对不起,大多数人很难理解流苏语言,即任何非英语的语言,因此表名和字段名毫无意义。胡说八道的人很难对它进行调试

这就是说:我认为您可以通过不在top 1上运行无意义的循环来减少查询总量,而是让所有内容按降序排列。残酷地说:摆脱循环,编写一条编译结果集的语句。认真地这应该是可能的。不要像20年前许多人在dbase时代那样,试图智胜查询优化器,转而编写过程数据库代码。一般来说您的查询是线性的,这意味着没有并行化,而您对条件的微观管理意味着没有查询优化器可以进行智能操作,因为优化是逐语句进行的。在一条语句中定义结果集,您可能会想知道它的效率有多高

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

最后,如果不知道您的数据分布和-哎哟-索引-我们真的帮不上忙。也许你只是错过了一些合理的指标?谁知道呢?你什么都不告诉我们没有查询计划输出,没有表定义,没有索引定义


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

显示创建该数据库和表的MySQL。特别是,显示您拥有的索引。最好发布示例数据和期望的结果,这样我们就不必首先弄清楚您的RBAR代码在做什么。答案可能是以一种基于集合的方式重写它。还有什么版本的SQL Server?我第一次想插入图片,但我的声誉不够好,所以我把它们上传到了互联网上。我的数据库是由csv创建的,这就是数据库的外观嗯…你知道最小和最大函数吗?你在afronden上排序,你在该列上创建了索引吗?除了索引,您还可以尝试使用min和max函数,而不是使用top1进行排序。