Модераторы: skyboy
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Вынести алгоритм в отдельную процедуру 
:(
    Опции темы
3,14
Дата 3.2.2009, 15:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1614
Регистрация: 18.6.2004
Где: Н. Новгород

Репутация: нет
Всего: 24



Есть задача производить дискретизацию данных на MySQL сервере, чтобы не тянуть с сервера более миллиона записей, для того чтобы сформировать порядка 700. Я написал для этого хранимую процедуру (вставлю код чуть ниже), но проблема в том что код есть только для одной таблицы и конкретных ее четырех полей (qps_in, qps_out, qps_mcast и qps_total). Проблема заключается в том что нужно сделать аналогичные процедуры для других таблиц, причем имена полей и их количество будут отличаться. Но копипастить сам алгоритм дискретизации как то не хочется, а вот отделить его в отдельную хранимую процедуру никак не выходит :(

Собственно сама процедура:

Код

DELIMITER $$

DROP PROCEDURE IF EXISTS `my_proc` $$
CREATE PROCEDURE `my_proc` (from_date TIMESTAMP, step BIGINT)
BEGIN
  DECLARE to_date TIMESTAMP;
  DECLARE tprev TIMESTAMP;
  DECLARE tcurr TIMESTAMP;

  DECLARE done INT DEFAULT 0;

  DECLARE pperiod TIMESTAMP;
  DECLARE pin, pout, pmcast, ptotal INT;
  DECLARE sin, sout, smcast, stotal FLOAT;
  DECLARE scount INT;

  DECLARE mQuery VARCHAR;

  DECLARE mCursor CURSOR FOR
    SELECT period, qps_in, qps_out, qps_mcast, qps_total FROM tab1 WHERE period >= from_date
    UNION ALL
    SELECT period, qps_in, qps_out, qps_mcast, qps_total FROM tab2 WHERE period >= from_date
    ORDER BY period;
  DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = 1;

  SET to_date = CURRENT_TIMESTAMP();
  SET tprev = from_date;
  SET tcurr = DATE_ADD(tprev, INTERVAL step SECOND);

  SET sin    = 0;
  SET sout   = 0;
  SET smcast = 0;
  SET stotal = 0;
  SET scount = 0;

  CREATE TEMPORARY TABLE tmp_data(period TIMESTAMP, qin FLOAT, qout FLOAT, qmcast FLOAT, qtotal FLOAT);

  OPEN mCursor;
  REPEAT
    FETCH mCursor INTO pperiod, pin, pout, pmcast, ptotal;
    IF NOT done THEN
      WHILE (tcurr < pperiod) DO
        IF scount > 0 THEN
          SET sin    = sin / scount;
          SET sout   = sout / scount;
          SET smcast = smcast / scount;
          SET stotal = stotal / scount;
        END IF;
        INSERT INTO tmp_data VALUES (tcurr, sin, sout, smcast, stotal);
        SET sin    = 0;
        SET sout   = 0;
        SET smcast = 0;
        SET stotal = 0;
        SET scount = 0;
        SET tprev  = tcurr;
        SET tcurr  = DATE_ADD(tprev, INTERVAL step SECOND);
      END WHILE;
      SET sin    = sin + pin;
      SET sout   = sout + pout;
      SET smcast = smcast + pmcast;
      SET stotal = stotal + ptotal;
      SET scount = scount + 1;
    END IF;
  UNTIL done END REPEAT;
  CLOSE mCursor;

  IF scount > 0 THEN
    SET sin    = sin / scount;
    SET sout   = sout / scount;
    SET smcast = smcast / scount;
    SET stotal = stotal / scount;
    INSERT INTO tmp_data VALUES (tcurr, sin, sout, smcast, stotal);
    SET tprev  = tcurr;
    SET tcurr  = DATE_ADD(tprev, INTERVAL step SECOND);
  END IF;

  WHILE tcurr < to_date DO
    INSERT INTO tmp_data VALUES (tcurr, 0, 0, 0, 0);
    SET tprev  = tcurr;
    SET tcurr  = DATE_ADD(tprev, INTERVAL step SECOND);
  END WHILE;

  SELECT * FROM tmp_data;
END $$

DELIMITER ;



--------------------
Может быть, это только мой бред,
Может быть, жизнь не так хороша,
Может быть, я не выйду на свет,
Но я летал, когда пела душа...
PM MAIL   Вверх
skyboy
Дата 3.2.2009, 16:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


неОпытный
****


Профиль
Группа: Модератор
Сообщений: 9820
Регистрация: 18.5.2006
Где: Днепропетровск

Репутация: 41
Всего: 260



может быть, средствами представлений сделать?
PM MAIL   Вверх
3,14
Дата 3.2.2009, 17:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1614
Регистрация: 18.6.2004
Где: Н. Новгород

Репутация: нет
Всего: 24



Цитата(skyboy @  3.2.2009,  16:35 Найти цитируемый пост)
может быть, средствами представлений сделать? 

Что то я не понял какой это даст выигрыш по сравнению с процедурами? И как вообще их тут использовать?  smile 


--------------------
Может быть, это только мой бред,
Может быть, жизнь не так хороша,
Может быть, я не выйду на свет,
Но я летал, когда пела душа...
PM MAIL   Вверх
skyboy
Дата 3.2.2009, 17:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


неОпытный
****


Профиль
Группа: Модератор
Сообщений: 9820
Регистрация: 18.5.2006
Где: Днепропетровск

Репутация: 41
Всего: 260



можно сделать более общие представления, а в более "частных" использовать его.
как в процедуре использовать в качестве источника данных результат выполнения другой процедуры - я даже не представляю.
с другой стороны, это просто выкрик из зала: по приведенному коду я не понял логики работы твоей процедуры. потому, может, и в самом деле - представлением никак не решить, только процедурой с курсором.
PM MAIL   Вверх
3,14
Дата 4.2.2009, 11:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1614
Регистрация: 18.6.2004
Где: Н. Новгород

Репутация: нет
Всего: 24



Логика работы такая, есть набор данных с разным шагом, причем в разных таблицах (до 5 таблиц для одного типа данных). И нужно пересчитать среднее значение этих данных с другим шагом.
В целом я сейчас это сделал через создание временной таблицы с новыми интервалами данных, по которым нужно пересчитать. Но в целом смущает то, что теперь приходится писать множество однотипных SELECT-ов, в к-ых отличаются только имена таблиц и списки полей запроса.


--------------------
Может быть, это только мой бред,
Может быть, жизнь не так хороша,
Может быть, я не выйду на свет,
Но я летал, когда пела душа...
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | MySQL | Следующая тема »


 




[ Время генерации скрипта: 0.0462 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.