Предыдущее сообщение было отправлено неоконченным, простите.
Про нее... если я правильно вас понял -то можно считать что время на ее формирования не входит затраты на получение отчета но мне непонятно почему мелкие выборки в правильно проиндексированной супертаблице занимают так много времени?
Конечно не входит. Вам таблица уже дана.
Но она в плоском виде на сервере СУБД.
Если в этой таблице выделить самую суть то будет три колонки
[на что затрачено][что затрачено][сумма]
А вам это нужно на клиенте в виде дерева вывести. Чтобы это сделать нужно эту таблицу рекурсивно обойти.
А чтобы ее рекурсивно обойти вам нужно закачать ее на клиента. А на клиенте она в оперативу вся не влезет.
Это трабл.
Но нам нужна ведь не вся таблица. А только то что входит в наше дерево. Мы например сделали отбор по одному виду продукции. Т.е. из 10м строк в разузловании будут учавствовать только 500 например.
Но вы не можете получить одним запросом эти 500 строк, т.к. вам не известна глубина дерева!!!
Это трабл.
Можно запросом получать затраты по каждому полученному элементу дерева. Но запросы тяжелые, и отчет будет формироваться очень долго.
Это трабл.
Ничего непонятно...
Предположим, что таблица имеет примерно такую структуру:
1. Показатель; (первичный ключ) [INDICATOR];
2. Ссылка на показатель верхнего уровня (внешний ключ, может быть null для корневых узлов) [OWNER_INDICATOR];
3. Единицы измерения [UNIT];
4. Значение показателя в натуральном выражении (объём/количество) [VAL_NATURAL];
5. Значение показателя в денежном выражении [VAL_CURRENCY].
Примечания:
А) если одна ветка иерархии входит в несколько веток, то есть, записи таблицы ссылаются на другие записи той же таблицы в отношении многие-ко-многим, то нужна ещё таблица для ссылок;
Б) более оптимальное (правильное) решение состоит в том, что структура показателей хранится отдельно от значений показателей.
При данной структуре таблицы надо иметь всего один параметризуемый запрос, чтобы вывести нужный показатель:
SELECT "INDICATOR", "UNIT", "VAL_NATURAL", "VAL_CURRENCY" FROM "MY_TABLE" WHERE "OWNER_INDICATOR" = :OIND;Когда пользователь "щёлкает" на каком-то показателе, подставляем его идентификатор в запрос, получаем данные и выводим на экран. Происходит это очень быстро (как правило, миллисекунды для тысяч записей), поскольку по внешнему ключу [по умолчанию] создаётся индекс.