Построение большой таблицы иерархии PHP + PostgreSQL, наиболее быстрый вывод на страницу?
Добрый день.
Есть задача следующего типа - имеется база данных на PostgreSQL:
- таблица staff содержит иерархию типа родитель-потомок, сейчас записей порядка 500;
- таблица sales содержит информацию о продажах на каждый день, но продажи фиксируются только на нижнем уровне иерархии;
- таблица plans содержит планы всех из таблицы staff по месяцам;
Одним запросом к БД я вытаскиваю всю иерархию join'ом прибавляю к ней plans и sales, суммируя на родителя. Сам запрос выполняется быстро, phpPgAdmin при выполнении запроса выдает 330.565 мсек, конечно хотелось бы быстрее, но быстрее, мне кажется, уже невозможно.
На выходе я получаю двумерный массив, с которым мне теперь и предстоит работать. Сейчас все работает через рекурсивный перебор массива, т.к. нужно соблюсти еще и иерархию.
Логика следующая - на входе я имею id самого первого родителя, в моём случае id=1. Функция работает так, она через самописную функцию arraySearch() находит всех потомков, у кого parent_id=1, и записывает их в новый массив, в моем случае их получается 6, потом функция вызывается еще раз и находит потомков уже у этих 6-ти и так далее. Каждый раз находя значение, arraySearch() удаляет из первоначального массива найденные значения, тем самым уменьшая массив для ускорения поиска при каждой последующей итерации. Функция продолжает вывод пока массив не опустеет. Всё работает, но работает медленно. Я уверен что есть более быстрый способ вывода, но идеи кончились.
Если есть какие то идеи, просьба подсказать. Так же просьба подсказать по запросу, возможно можно выполнить запрос быстрее.
чтобы вам ответить - нужно больше деталей (структура таблиц) А 330.565мсек -это супер много. Такое время характерно для запросов из таблиц от 100 миллионов записей.
Таблицы, участвующие в запросе: staff, sales, plans.
- staff: id_staff, name, post, parent_id, sort (для уникальной сортировки по желанию юзера)
- sales: staff_id, amount, date
- plans: staff_id, amount, month
Рекурсивным запросом вытягиваю всех из таблицы staff и sales, при этом sales суммируются, т.е. имеется id_staff = 1, у него есть потомки id_staff = 2, 3, 4, 5. У каждого из потомков есть запись в таблице sales, они должны в результате запроса суммироваться на id_staff = 1.
Спасибо, но сам запрос я уже построил, проблема заключается именно в быстром выводе полученных данных на страницу. В моём текущем решении вся операция (от запроса до полного вывода) занимает порядка 8-9 секунд, что для пользователя не удобно. Я ему конечно показываю, что страница грузится, но тем не менее. Это сейчас 8-9 секунд, а если данные разрастутся, то это займёт еще больше времени.