Биллинговая система Nodeny
23 Ноября 2024, 02:02:45 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
Новости: Прекращена поддержка версии Nodeny 49
 
   Начало   Помощь Поиск Войти Регистрация  
Страниц: [1]
  Печать  
Автор Тема: процедура set_dopvalues (49|50).33  (Прочитано 5650 раз)
0xbad0c0d3
гуру nodeny )
NoDeny
Спец
*

Карма: 116
Offline Offline

Сообщений: 1059



Просмотр профиля
« : 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)

Если есть дубликаты, то выполняется так же быстро Подмигивающий Прошу всех на тест Веселый
Если надумаете запускать в работу - не забудьте назвать процедурку правильно: set_dopvalues
« Последнее редактирование: 21 Июня 2012, 16:56:22 от 0xbad0c0d3 » Записан
ale-x
NoDeny
Постоялец
*

Карма: 1
Offline Offline

Сообщений: 164


Просмотр профиля
« Ответ #1 : 23 Июня 2012, 20:13:36 »

Что-то я у себя в базе этой процедуры не наблюдаю... 50.32.6
Записан
0xbad0c0d3
гуру nodeny )
NoDeny
Спец
*

Карма: 116
Offline Offline

Сообщений: 1059



Просмотр профиля
« Ответ #2 : 23 Июня 2012, 20:41:03 »

Написано же 49.33 50.33 ))) В 50.32 ее нет
Записан
Efendy
Администратор
Спец
*****

Карма: 138
Offline Offline

Сообщений: 4790



Просмотр профиля
« Ответ #3 : 28 Июня 2012, 12:07:09 »

Поставил в одной из сетей твою процедуру, пусть тестируют на живых абонентах)
Записан
0xbad0c0d3
гуру nodeny )
NoDeny
Спец
*

Карма: 116
Offline Offline

Сообщений: 1059



Просмотр профиля
« Ответ #4 : 30 Июня 2012, 16:02:24 »

Я у себя сразу поставил )) Пока без "боков", по крайней мере саппорт не жалуется Веселый
Записан
Страниц: [1]
  Печать  
 
Перейти в:  

Powered by MySQL Powered by PHP Powered by SMF 1.1.20 | SMF © 2006-2009, Simple Machines Valid XHTML 1.0! Valid CSS!