|
Join по неизвестным таблицам
|
|||
---|---|---|---|
#18+
Есть такая задача: разработчики софта обратились ко мне с вопросом 1) есть необходимость делать объединения по нескольким таблицам 2) сама структура каждой из таблиц заранее неизвестна 3) у каждой таблицы есть первичный ключ ROW16 4) объединения идут по первичному ключу 5) FK между таблицами обеспечивается на уровне Application Server. Разработчики гарантируют что сбоев в работе FK не будет. 7) размер таблиц до нескольких сот тысяч строк 8) обновления данных редкие 9) запросы надо создавать динамически (программно) Вот пример такого запроса Код: plaintext 1. 2. 3. 4. 5. 6.
Время обработки такого запроса ужасающе - более минуты Нужно минимизировать время исполнения. ________________________________________ Я предложил Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12.
И увеличить Sort_aria_size ____________________________________ Мне кажется что это не единственное и не наилучшее решение. Однако ничего другого универсального я предложить не могу. Кстати мне показалось интересным что ни в первом ни во втором случае план исполнения не показывает обращения к индексам таблицы MAIN. Почему? Еще интересно что увеличением sort_aria_size я добился ускорения в несколько раз и всё. Дальнейшее увеличение ни к чему не ведет, хотя оперативная память еще есть. К вышесказанному сильно используется Temproary tablespace. Неужели нельзя добиться чтобы для исполнения запроса не требовалось до 200M во временном пространстве. Еще замечание хинт FirstRows замедляет выполнение запроса по сравнению с AllRows. Незначительно но замедляет. Почему если нужно всего 40 строк из 100000 хинт так работает. Буду благодарен за любые высказывания. ... |
|||
:
Нравится:
Не нравится:
|
|||
02.11.2002, 19:53 |
|
Join по неизвестным таблицам
|
|||
---|---|---|---|
#18+
я, наверное, что-то посоветовал бы :-), если бы увидел план выполнения и иниц. параметры, влияющие на оптимизатор. А как там со сбором статистики? ... |
|||
:
Нравится:
Не нравится:
|
|||
04.11.2002, 20:55 |
|
Join по неизвестным таблицам
|
|||
---|---|---|---|
#18+
Запрос выглядит так Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13.
PL/SQL DEVELOPER показывает так Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14.
хотя на самом деле выигрыш по времени от хинта есть. Параметры optimizer_index_cost_adj = 1 sort_area_size увеличен c 65 до 1000 Кб optimizer_mode - разное лучше всего под CHOOSE или ALL_ROWS hash_area_size - не задано optimizer_features_enable при задании в TRUE не стартует экземпляр ... |
|||
:
Нравится:
Не нравится:
|
|||
05.11.2002, 14:42 |
|
Join по неизвестным таблицам
|
|||
---|---|---|---|
#18+
Да еще такая заметка разработчики хотят сделать тиражируемый програмный продукт ... |
|||
:
Нравится:
Не нравится:
|
|||
05.11.2002, 14:51 |
|
Join по неизвестным таблицам
|
|||
---|---|---|---|
#18+
Зачем же так извращаться?: Код: plaintext 1. 2. 3. 4. 5. 6. 7.
Если ты используешь INDEX_DESC -тебе нет необходимости делать select из select-а. И еще, тебя никто что-ли не научил, что можно использовать алиасы, вместо названий таблиц? И что за идиотское main.id > '0000000000000000'? Для чего это? Для того что-бы задействовать индекс? Судя по плану выполнения он у тебя вообще не задействован. Не проще ли вот так: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18.
Попробуй это. И план сообщи какой. ... |
|||
:
Нравится:
Не нравится:
|
|||
05.11.2002, 15:10 |
|
Join по неизвестным таблицам
|
|||
---|---|---|---|
#18+
И еще, сортировка вообще говоря в м - тоже не имеет смысла. Если тебе нужно в результирующем запросе получить сортировку, значит надо на его уровне это делать: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19.
... |
|||
:
Нравится:
Не нравится:
|
|||
05.11.2002, 15:26 |
|
Join по неизвестным таблицам
|
|||
---|---|---|---|
#18+
На счет алиасов: у них запросы генерятся программно им так удобней, а на производительности это никак не сказывается На счет: "Main.ID>" это опять таки и для чего-то нужно и жить они без этого не могут. Сортировка не нужна, нужно чтобы выбрались именно первые записи. А вот то что убралось ORDER BY это здорово. Всё залетало так как я во сне не представлял Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17.
Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14.
... |
|||
:
Нравится:
Не нравится:
|
|||
05.11.2002, 18:32 |
|
|
start [/forum/topic.php?fid=52&msg=32064998&tid=1992807]: |
0ms |
get settings: |
11ms |
get forum list: |
13ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
46ms |
get topic data: |
10ms |
get forum data: |
3ms |
get page messages: |
45ms |
get tp. blocked users: |
1ms |
others: | 252ms |
total: | 387ms |
0 / 0 |