Этот баннер — требование Роскомнадзора для исполнения 152 ФЗ.
«На сайте осуществляется обработка файлов cookie, необходимых для работы сайта, а также для анализа использования сайта и улучшения предоставляемых сервисов с использованием метрической программы Яндекс.Метрика. Продолжая использовать сайт, вы даёте согласие с использованием данных технологий».
Политика конфиденциальности
|
|
|
Оптимизация запроса.
|
|||
|---|---|---|---|
|
#18+
Возникла следующая проблема. Может быть, она уже решалась на данном форуме, но пока не нашел ничего похожего. Есть таблицы (менять структуру, скорее всего, нельзя, но обоснованные советы по ее изменению тоже принимаются). Таблицы достаточно большого объема. Items - несколько тысяч записей, Links - сотни тысяч записей, может быть, даже несколько миллионов. Items (Id INT PRIMARY KEY, Name VARCHAR(64)) - справочник Links (Id INT, PrevId INT) - ссылки на предков для организации дерева DLinks (Id INT, PrevId INT) - ссылки на всех предков для ускорения поиска по дереву List (StrId, RDate DATE, ItemId, ... FOREIGN KEY(ItemId) REFERENCES Items ON DELETE CASCADE) - некая таблица со ссылками на Items Требуется получить список элементов справочника с количеством записей в List, ссылащихся на конкретный элемент и всех его потомков в дереве. Сейчас это делается примерно так: SELECT Id, PrevId, Name, ( SELECT COUNT(DISTINCT StrId) FROM List WHERE ItemId=Items.Id OR ItemId IN (SELECT Id FROM DLinks WHERE PrevId=Items.Id) ) AS Summ FROM Items, Links WHERE Links.Id=Items.Id Запрос выполняется непростительно долго. План доступа показывает, что основные затраты (больше половины единиц времени) идут на поиск по DLinks. Как можно перестроить запрос для существенного ускорения его выполнения? Виктор ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.05.2007, 21:04 |
|
||
|
Оптимизация запроса.
|
|||
|---|---|---|---|
|
#18+
Ну так вы создайте план запроса, и положите здесь - посмотрим. 1) План запроса - смотрите по хелпу утилиты: db2expln.exe db2exfmt.exe 2) Создание таблиц объяснения: SQLLIB\MISC\explain.ddl 3) А также ничего не сказано какие есть индексы на других таблицах 4) Собиралась ли статистика? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.05.2007, 11:11 |
|
||
|
Оптимизация запроса.
|
|||
|---|---|---|---|
|
#18+
Вы бы пример заполнения таблиц links и dlinks для 2-х предков одного item прислали. И уточните задачу: вы запрос делаете для конкретного item или для всего справочника items? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.05.2007, 11:16 |
|
||
|
Оптимизация запроса.
|
|||
|---|---|---|---|
|
#18+
А какие индексы имеются? Стандартный совет - загнать запрос в Quest Central, запустить тюнер и прогнать через советчик по индексам (то же самое можно сделать из командной строк, но менее удобно) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.05.2007, 16:07 |
|
||
|
Оптимизация запроса.
|
|||
|---|---|---|---|
|
#18+
Запрос делается по всему справочнику (запрос, кстати, приведен). Индексы сделаны именно так, как рекомендовал советчик по индексам, хотя и до того при любой комбинации индексов картина была аналогичная, с точностью до небольшого ускорения или замедления, на общем фоне малозаметного. RUNSTAT и REORG выполнялись регулярно (реорганизовывалась вся БД), эффект опять совершенно незначительный. В ближайшее время получить план доступа и заполнение таблиц не получится, не доберусь до компьютера с БД. Могу пока только обрисовать на словах. Согласно плану доступа (как я его запомнил) основное время тратится на индексскан по индексу таблицы DLinks, включающему оба поля таблицы. У меня сложилось впечатление, что это все из-за того, что для каждого элемента справочника запрашиваются все его потомки. Ветвистость дерева преизрядная, глубина до 10 доходит. Потому подумалось, что, может быть, можно построить рекурсивный запрос, обходящий дерево от листьев, и постепенно суммирующий результаты при движении к корню, чтобы постоянно эти листья не ворошить при подсчете в каждом узле. Или я что-то не совсем понимаю? Если подсчитывать количество только для каждого узла дерева, без учета потомков, то все выполняется шустренько, но потомков надо учитывать полюбому. Уже подумываю о том, чтобы сначала получить сумму по каждому узлу, а потом в таблице-результате уже ручками дерево обойти от листьев до корня, и просуммировать. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.05.2007, 19:15 |
|
||
|
Оптимизация запроса.
|
|||
|---|---|---|---|
|
#18+
И все-таки, скажите: Если у вас Код: plaintext 1. 2. 3. 4. 5. 6. то в DLINKS будет Код: plaintext 1. 2. 3. 4. 5. 6. или как? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.05.2007, 19:42 |
|
||
|
Оптимизация запроса.
|
|||
|---|---|---|---|
|
#18+
Ну не знаю, я в любом бы случае написал рекурсивный запрос.- другой вариант - навесить триггер, который в случае добавления в дерево рекурсивно апдейтит некое поле у предков. Аналогично для удаления. Дле перемещения ветки - все также достаточно тривиально. Тогда вам придется поднять только одну запись, чтобы получить ответ на ваш вопрос. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.05.2007, 11:09 |
|
||
|
|

start [/forum/topic.php?fid=43&fpage=113&tid=1604564]: |
0ms |
get settings: |
9ms |
get forum list: |
20ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
42ms |
get topic data: |
12ms |
get forum data: |
3ms |
get page messages: |
53ms |
get tp. blocked users: |
1ms |
| others: | 265ms |
| total: | 411ms |

| 0 / 0 |
