我有一个简单的数据库,我想在其上进行简单的查询。
这些是我的数据库表的列:
列是:
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行。
有人知道如何优化我的查询吗?
答案 0 :(得分:1)
嗯,曾经认为不使用破碎的程序方法可能是一个想法吗?
首先,你的逻辑可能会被打破 - 时间太长了,所以也许你只是有一个死循环。对不起,大多数人都很难理解边缘语言 - 即任何不是英语的东西,所以你的桌面和字段名称没有意义。对于不了解它的人来说,废话几乎是不可调试的。
这就是说:我认为你可以通过不在前1上运行无意义的循环来完成总共很少的查询 - 而是让所有顺序降序。严厉地说:摆脱循环并制作编译结果集的ONE语句。认真。那应该是可能的。不要试图超越查询优化器,回过头来编写程序数据库代码,就像许多人20年前在dbase时所做的那样。一般来说。您的查询是线性的,这意味着没有并行化,您的条件微观管理意味着没有查询优化器可以做聪明的事情(因为优化是逐个语句)。在一个语句中定义结果集,您可能想知道它的效率如何。
我很确定最后你会发现你基本上试图超越一些比你编写查询更好的东西。使用SQL - 定义结果集。
最后,在不知道您的数据分布和 - ouch - 指数的情况下,我们无法提供帮助。也许你只是错过任何明智的指数?谁知道 - 你不告诉我们任何事情(没有查询计划输出,没有表格定义,没有索引定义)。
它可能也不会滥用数据类型:声明@Datum varchar - OUCH。曾经听说过sql server中的DATE数据类型吗?