优化T-SQL,其中数组会很好

时间:2010-06-01 18:36:44

标签: sql sql-server sql-server-2005

好的,首先你需要拿一个barf包。我的任务是在我们的数据库中优化几个旧的存储过程。该SP执行以下操作:

1)光标循环通过一系列“建筑物”

2)游标循环一周,周日 - 周六

3)有一大组IF块,负责计算给定建筑物中存在的类型的对象数量

基本上你会在这个代码块中看到的是,如果有5个#2类型的对象,它会将@ Type_2_Objects_5增加1。

    IF @Number_Type_1_Objects = 0
    BEGIN
        SET @Type_1_Objects_0 = @Type_1_Objects_0 + 1
    END
    IF @Number_Type_1_Objects = 1
    BEGIN
        SET @Type_1_Objects_1 = @Type_1_Objects_1 + 1
    END
    IF @Number_Type_1_Objects = 2
    BEGIN
        SET @Type_1_Objects_2 = @Type_1_Objects_2 + 1
    END
    IF @Number_Type_1_Objects = 3
    BEGIN
        SET @Type_1_Objects_3 = @Type_1_Objects_3 + 1
    END
[... Objects_4 through Objects_20 for Type_1]

IF @Number_Type_2_Objects = 0
    BEGIN
        SET @Type_2_Objects_0 = @Type_2_Objects_0 + 1
    END
    IF @Number_Type_2_Objects = 1
    BEGIN
        SET @Type_2_Objects_1 = @Type_2_Objects_1 + 1
    END
    IF @Number_Type_2_Objects = 2
    BEGIN
        SET @Type_2_Objects_2 = @Type_2_Objects_2 + 1
    END
    IF @Number_Type_2_Objects = 3
    BEGIN
        SET @Type_2_Objects_3 = @Type_2_Objects_3 + 1
    END
[... Objects_4 through Objects_20 for Type_2]

IF @Number_Type_1_Objects = 0 BEGIN SET @Type_1_Objects_0 = @Type_1_Objects_0 + 1 END IF @Number_Type_1_Objects = 1 BEGIN SET @Type_1_Objects_1 = @Type_1_Objects_1 + 1 END IF @Number_Type_1_Objects = 2 BEGIN SET @Type_1_Objects_2 = @Type_1_Objects_2 + 1 END IF @Number_Type_1_Objects = 3 BEGIN SET @Type_1_Objects_3 = @Type_1_Objects_3 + 1 END [... Objects_4 through Objects_20 for Type_1] IF @Number_Type_2_Objects = 0 BEGIN SET @Type_2_Objects_0 = @Type_2_Objects_0 + 1 END IF @Number_Type_2_Objects = 1 BEGIN SET @Type_2_Objects_1 = @Type_2_Objects_1 + 1 END IF @Number_Type_2_Objects = 2 BEGIN SET @Type_2_Objects_2 = @Type_2_Objects_2 + 1 END IF @Number_Type_2_Objects = 3 BEGIN SET @Type_2_Objects_3 = @Type_2_Objects_3 + 1 END [... Objects_4 through Objects_20 for Type_2]

除了非常hacky(并限制为20个对象的数量),它似乎是一种处理这个的可怕方式。在传统语言中,这可以通过二维数组轻松解决......

我是一个T-SQL新手,但由于编写存储过程经常使用很多临时表(基本上可能是一个二维数组),我想知道是否有人可以说明更好的处理类似情况的方法这有两个动态的数据存储。

请求评论


列只是

  • Number_Type_1_Objects
  • Number_Type_2_Objects
  • Number_Type_3_Objects
  • Number_Type_4_Objects
  • Number_Type_5_Objects
  • CurrentDateTime。

表格中的每一行代表5分钟。

预期的输出是计算每天给定数量的物体存在的时间百分比。

objects[type][quantity] += 1;

在星期天,有一个类型1的0个对象,占当天的34.85%。当天有42.93%有1个对象,当天有22.22%有2个对象。对每种对象类型重复。

1 个答案:

答案 0 :(得分:1)

一个快速简便的解决方案,可以让你接近你想要的地方做一个类似于

的联盟
select 'type1objects' as objecttype
       datepart(dw, currentdatetime) as dayofweek, 
       number_type_1_objects as numberofobjects, 
       count(number_type_1_objects) as rows
from yourtable
group by convert(varchar(10), currentdatetime,101), datepart(dw, currentdatetime), number_type_1_objects
union
select 'type2objects' as objecttype
       datepart('d',currentdatetime) as dayofweek,
       number_type_2_objects as numberofobjects, 
       count(*) as rows
from yourtable
group by convert(varchar(10),currentdatetime,101), datepart(dw,currentdatetime), number_type_2_objects
每个对象列的

等等。这应该可以让你得到你现在获得的数据的近似值,而无需使用那些疯狂的变量和光标,不能承受的建筑物。你可以加入建筑物表,只需将它添加到组中并完成它。不确定,因为我不知道将会得到什么样的关系......