Биллинговая система Nodeny

Главная категория => Nodeny 50 => Тема начата: 0xbad0c0d3 от 21 Июня 2012, 16:54:33



Название: процедура set_dopvalues (49|50).33
Отправлено: 0xbad0c0d3 от 21 Июня 2012, 16:54:33
Очень как-то не понрвилась скорость выполнения процедуры... теблица с допданными очень большая ((
Решил ее оптимизировать вот что получилось:
Код:
DROP PROCEDURE IF EXISTS `set_dopvalues_new`;
DELIMITER $$
CREATE PROCEDURE `set_dopvalues_new`(IN rev INT)
BEGIN
        DECLARE p_id INT;
        DECLARE d_id INT;
        DECLARE n INT;
        SELECT parent_id,dopfield_id INTO p_id,d_id FROM dop_oldvalues WHERE revision=rev LIMIT 1;
        START TRANSACTION;
        /*Deleting unactual data BEGIN*/
        DELETE FROM dopvalues USING dopvalues
        INNER JOIN dop_oldvalues
        ON dopvalues.dopfield_id=dop_oldvalues.dopfield_id
        WHERE dopvalues.parent_id=p_id AND dop_oldvalues.revision=rev;
        /*Deleting unactual data END*/
        /*Checking on duplicate fields with 'h' flag BEGIN*/
        IF EXISTS (SELECT id FROM dopfields WHERE field_flags LIKE '%h%') THEN
                SELECT COUNT(*),dv.dopfield_id INTO n,d_id FROM dopvalues dv
                INNER JOIN (
                        SELECT odv.field_value value,odv.dopfield_id id FROM dop_oldvalues odv
                        INNER JOIN dopfields df
                        ON df.id=odv.dopfield_id
                        WHERE odv.parent_id=p_id AND odv.revision=rev AND
                        df.field_flags LIKE '%h%' AND odv.field_value<>''
                ) dv1
                ON dv1.value=dv.field_value AND dv1.id=dv.dopfield_id
                WHERE dv.field_value<>''
                GROUP BY dv.dopfield_id;
        END IF;
        /*Checking on duplicate fields with 'h' flag END*/
        IF( n>0 ) THEN
                ROLLBACK;
                SELECT 1 AS error, d_id AS descr;
        ELSE
                INSERT INTO dopvalues (parent_id,dopfield_id,field_value)
                SELECT parent_id,dopfield_id,field_value FROM dop_oldvalues WHERE revision=rev;
                COMMIT;
                SELECT 0 AS error, '' AS descr;
        END IF;
END$$
DELIMITER ;
А вот тесты. Первый тест это скорость выполнения, когда вообще нет полей с флагом уникальности (Флаг: h)
Код:
mysql> call set_dopvalues_new(516477);call set_dopvalues(516477);
+-------+-------+
| error | descr |
+-------+-------+
|     0 |       |
+-------+-------+
1 row in set (0.15 sec)

Query OK, 0 rows affected (0.15 sec)

+-------+-------+
| error | descr |
+-------+-------+
|     0 |       |
+-------+-------+
1 row in set (4.81 sec)

Query OK, 0 rows affected, 1 warning (4.81 sec)
И результат с имеющимся полем с флагом уникальности:
Код:
mysql> call set_dopvalues_new(521752);call set_dopvalues(521752);
+-------+-------+
| error | descr |
+-------+-------+
|     0 |       |
+-------+-------+
1 row in set (0.19 sec)

Query OK, 0 rows affected, 1 warning (0.19 sec)

+-------+-------+
| error | descr |
+-------+-------+
|     0 |       |
+-------+-------+
1 row in set (6.13 sec)

Query OK, 0 rows affected, 1 warning (6.13 sec)

Если есть дубликаты, то выполняется так же быстро ;) Прошу всех на тест :D
Если надумаете запускать в работу - не забудьте назвать процедурку правильно: set_dopvalues


Название: Re: процедура set_dopvalues (49|50).33
Отправлено: ale-x от 23 Июня 2012, 20:13:36
Что-то я у себя в базе этой процедуры не наблюдаю... 50.32.6


Название: Re: процедура set_dopvalues (49|50).33
Отправлено: 0xbad0c0d3 от 23 Июня 2012, 20:41:03
Написано же 49.33 50.33 ))) В 50.32 ее нет


Название: Re: процедура set_dopvalues (49|50).33
Отправлено: Efendy от 28 Июня 2012, 12:07:09
Поставил в одной из сетей твою процедуру, пусть тестируют на живых абонентах)


Название: Re: процедура set_dopvalues (49|50).33
Отправлено: 0xbad0c0d3 от 30 Июня 2012, 16:02:24
Я у себя сразу поставил )) Пока без "боков", по крайней мере саппорт не жалуется :D