Мне нужно проверить 30 миллионов записей (на один месяц) ежедневных проверок билетов (Unix datetime) и разделить их на 24 часовых периода для 211 станций.
Сначала я создал представление, которое выбираетмесяц, который я ищу (и тип оборудования), затем создает значение Windows Datetime для каждого Unix datetime.
SELECT TOP (100) PERCENT StationName AS Station, MainTable.UnixDateTime AS ValTime,
DATEADD(s, MainTable.UnixDateTime, CONVERT(DATETIME, '1970-01-01 00:00:00', 102)) AS WinTime
FROM MainTable
INNER JOIN StationName ON MainTable.StationID = StationName.StationID
WHERE (StationName.ValidStationCode = 32767) [use only valid stations]
AND (MainTable. UnixDateTime >= 1264996800)
AND (MainTable. UnixDateTime < 1267416000)
AND (MainTable.EquipmentCode IN (33, 36)) [examine only this equipment]
ORDER BY Station
Затем я запускаю основную процедуру, которая использует оператор выбора в этом представлении для каждого изчасовые периоды.Это 24 оператора выбора для каждой из 211 станций.
Пример 1)
Update table Set [0102]= (select count(ValTime)
from view
where Station = @thisStation and DatePart (Hour, WinTime)>= 1 and DatePart (Hour, WinTime)< 2)
from view
where table.Station = @thisStation
Пример 2)
Update table Set [0203]= (select count(ValTime)
from view
where Station = @thisStation and DatePart (Hour, WinTime)>= 2 and DatePart (Hour, WinTime)< 3)
from view
where table.Station = @thisStation
и т. Д.
Процедураработает - ууу!Это занимает 11 часов - Boo: (
Вывод например:
0001 0102 0203 0304...2324
Station1 27 34 567 231... 123
Station2 245 57 23 198... 21
etc.
Выходная таблица имеет 25 столбцов.
Существует более быстрый и лучший способ сделать это, ноЯ не знаю, что это такое. (Купите суперкомпьютер?) Я думал о рангах и разделах, но не могу представить, как это будет работать. Есть какие-нибудь гуру?