Оптимизация T-SQL, где массив был бы хорош - PullRequest
2 голосов
/ 01 июня 2010

Хорошо, сначала вам нужно взять сумку. Мне было поручено оптимизировать несколько старых хранимых процедур в нашей базе данных. Этот SP делает следующее:

1) курсор проходит через серию «зданий»

2) курсор зацикливается на неделю, воскресенье-суббота

3) имеет огромный набор блоков ПЧ, отвечающих за подсчет количества объектов того или иного типа в данном здании

По сути, вы увидите, что в этом блоке кода, если есть 5 объектов типа # 2, он увеличит @ Type_2_Objects_5 на 1.

</p> <pre><code> 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]

Помимо того, что он чрезвычайно хакерский (и ограничен количеством объектов в 20), он кажется ужасным способом справиться с этим. На традиционном языке это можно легко решить с помощью двумерного массива ...

objects[type][quantity] += 1;

Я новичок в T-SQL, но, поскольку при написании хранимых процедур часто используется много временных таблиц (которые, по сути, могут быть двумерными массивами), мне было интересно, сможет ли кто-нибудь осветить лучший способ обработки ситуации, такой как это с двумя динамическими частями данных для хранения.

Запрошено в комментариях


Столбцы просто

  • Number_Type_1_Objects
  • Number_Type_2_Objects
  • Number_Type_3_Objects
  • Number_Type_4_Objects
  • Number_Type_5_Objects
  • CurrentDateTime.

Каждая строка в таблице представляет 5 минут.

Ожидаемый результат - определить процент времени, в течение которого определенное количество объектов присутствует в течение каждого дня.

Sunday - Object Type 1 
0 objects - 69 rows, 5:45, 34.85% 
1 object - 85 rows, 7:05, 42.93% 
2 objects - 44 rows, 3:40, 22.22%

В воскресенье было 0 объектов типа 1 на 34,85% дня. Был 1 объект на 42,93% дня и 2 объекта на 22,22% дня. Повторите для каждого типа объекта.

1 Ответ

1 голос
/ 01 июня 2010

быстрое и простое решение, которое поможет вам приблизиться к тому месту, где вы хотите быть, состоит в создании союза, подобного

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

и т. Д. Для каждого столбца объекта. это должно дать вам приближение к данным, которые вы получаете сейчас без использования этих сумасшедших переменных и курсоров, здания не выдерживают. Вы, вероятно, могли бы присоединиться к таблице зданий, просто добавив ее в группу, и с этим тоже покончите. не уверен, хотя, поскольку я понятия не имею, какие отношения будут нарисованы ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...