Давно сделаны коммиты
http://ru-mangos.ru/showthread.php?t=3201 и
http://ru-mangos.ru/showthread.php?t=2824 , но таблицы с шаблонами почти пустые.
Только в YTDB 607_FIX_11789 появилось 2 шаблона в npc_vendor_template для entry 33238 и 33239 . Кстати, оба шаблона одинаковые по составу
.
Предлагаю запрос для заполнения таблиц шаблонов.
Результаты работы программы :
834 Строки обновлена [0,020c]
10995 Строки вставлена [2,553c] Это стало спелов в npc_trainer_template
834 Строки обновлена [0,012c] Число уникальных шаблонов тренеров
75473 Строки удалена [2,438c] полностью чистим npc_trainer
Для вендоров.
1954 Строки обновлена [0,304c]
21689 Строки вставлена [2,378c]
1954 Строки обновлена [0,027c]
34670 Строки удалена [2,146c]
Проверил на тестовом сервере, время загрузки ядра чуть-чуть уменьшилось.
Результаты свертки npc_trainer показали, что есть довольно много "нестандартных" тренеров, которые отличаются от коллег буквально одним заклинанием.
Похожую свертку можно применить уже к таблице npc_trainer_template и поискать "похожих" тренеров. Для наглядности лучше добавить к такой таблице trainer_class , trainer_type и т.д из creature_template и определить, должны ли быть отличия у тренеров.
Вендоры еще более разнообразны. Не факт, что это правильно.
Лишние шаблоны тренеров\вендоров можно вычистить.
Код:
-- Trainers
DROP TABLE IF EXISTS temp;
-- Делаем временную таблицу
-- e - entry тренера
-- с - число заклинаний
-- s сумма кодов заклинаний, используется в качестве хэш-функции,
-- которая позволяет надеяться, что наборы спелов у тренеров одинаковы
-- me = min(entry) - будущий entry шаблона
CREATE TABLE temp ENGINE = MEMORY
SELECT entry AS e , count(spell) AS c , sum(spell) AS s, 1 as me
FROM npc_trainer
GROUP BY e
ORDER BY 3, 2;
-- Если таблицу temp почистить от строк, в которых указаны "малоповторяющиеся" тренеры,
-- то можно часть информации оставить в npc_trainer, остальное перенести в npc_trainer_templatе .
-- Например, после запроса
-- delete from temp where temp.s in (select x.s from (SELECT s,count(s) as cs FROM temp GROUP BY s) as x where x.cs=1)
-- информацию об "уникальных тренерах" останется в npc_trainer
-- сопоставляем тренера с будущим entry шаблона
UPDATE temp, (SELECT min(e) AS m , s FROM temp GROUP BY s) AS t
SET me = m
WHERE temp.S = t.s;
-- копируем спелы в шаблон
INSERT INTO npc_trainer_template
SELECT * FROM npc_trainer
where npc_trainer.entry in (select distinct me from temp );
-- прописываем trainer_id всем "шаблонизированным" тренерам
UPDATE creature_template, temp
set trainer_id=me
WHERE entry=e;
-- Чистим данные о спелах "шаблонизированных" тренеров.
-- Так как в таблице temp все тренеры (даже те, которые уникальные), то запрос аналогичен DELETE FROM npc_trainer .
DELETE FROM npc_trainer
WHERE entry IN (select e from temp );
DROP TABLE IF EXISTS temp;
-- Vendors
-- С вендорами поступаем аналогично.
CREATE TABLE temp ENGINE = MEMORY
SELECT entry AS e , count(item) AS c , sum(item) AS s,1 as me
FROM npc_vendor
GROUP BY e
ORDER BY 3, 2;
UPDATE temp, (SELECT min(e) AS m , s FROM temp GROUP BY s) AS t
SET me = m
WHERE temp.S = t.s;
INSERT INTO npc_vendor_template
SELECT * FROM npc_vendor
where npc_vendor.entry in (select distinct me from temp );
UPDATE creature_template, temp
set vendor_id=me
WHERE entry=e;
DELETE FROM npc_vendor
WHERE entry IN (select e from temp );
DROP TABLE IF EXISTS temp;