【发布时间】:2012-04-30 08:18:15
【问题描述】:
我有一个简单的数据库,我想做一个简单的查询。
这些是我的数据库表的列:
- 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
After 22 分钟后,仅处理了 44000 行。
有人知道如何优化我的查询吗?
【问题讨论】:
-
显示创建该数据库和表的 MySQL。特别是,显示您拥有的索引。
-
最好发布示例数据和所需结果,这样我们就不必先弄清楚您的 RBAR 代码在做什么。答案可能是以基于集合的方式重写它。还有什么版本的 SQL Server?
-
我最初想插入图片,但我的声誉不够好,所以我将它们上传到互联网上。我的数据库是由 csv 创建的,这就是数据库的样子
-
嗯...你知道“min()”和“max()”函数吗?
-
您按
afronden排序,您是否在该列上创建了索引?除了索引之外,您还可以尝试使用min()和max()函数,而不是使用带有排序的top(1)。
标签: performance sql-server-2012