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