Этот баннер — требование Роскомнадзора для исполнения 152 ФЗ.
«На сайте осуществляется обработка файлов cookie, необходимых для работы сайта, а также для анализа использования сайта и улучшения предоставляемых сервисов с использованием метрической программы Яндекс.Метрика. Продолжая использовать сайт, вы даёте согласие с использованием данных технологий».
Политика конфиденциальности
|
|
|
Почему не используется индекс при самом обычном джойне?
|
|||
|---|---|---|---|
|
#18+
Всем привет! А задача предельно простая: есть две таблицы. Нужно сделать джойн этих таблиц и вывести первые две результирующие записи. Размер этих таблиц - по 140000 записей в каждой. Запрос выполняется 15 секунд. Смотрю по плану - сервер ДБ2 при выполнения джойна не использует индексы (а использует MSJOIN вместо NLJOIN). Не могу понять, почему. Разьясните, пожалуйста, как я могу ускорить работу этого джойна? Версия базы - DB2 8.2 (фикспак тот, который месяц назад был последним, это вроде 13-й) Помогите пожалуйста! А теперь подробная информация. Запрос: Код: plaintext 1. 2. 3. 4. Рисунок плана выполнения запроса находится по ссылке: план джойна или здесь: плай джойна 2 Скрипт создания таблицы Document Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. Скрипт создания таблицы NEWS: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. Почему DB2 не использует индекс при джойне? Всем заранее спасибо! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.10.2006, 00:50 |
|
||
|
Почему не используется индекс при самом обычном джойне?
|
|||
|---|---|---|---|
|
#18+
Да, статистика вся построена и актуальна. Вот она: Статистика индекса по Document.dcm_unid и Статистика индекса по News.dcm_unid ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.10.2006, 00:57 |
|
||
|
Почему не используется индекс при самом обычном джойне?
|
|||
|---|---|---|---|
|
#18+
Здравствуйте. Создайте индекс по полю news.dcm_unid, соберите статистику. И попробуйте Код: plaintext 1. 2. 3. 4. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.10.2006, 09:29 |
|
||
|
Почему не используется индекс при самом обычном джойне?
|
|||
|---|---|---|---|
|
#18+
Mark BarinsteinЗдравствуйте. Создайте индекс по полю news.dcm_unid, соберите статистику. И попробуйте Код: plaintext 1. 2. 3. 4. По полю dcm_unid присутствует первичный ключ. Статистика собрано. Выполняю Ваш запрос. Получаю 6 секунд на выполение этого запроса, и следующий план: План выполнения джойна Как видите, план фактически тот же самый. Подскажите, что я могу сделать, чтобы этот запрос работал быстрее? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.10.2006, 11:36 |
|
||
|
Почему не используется индекс при самом обычном джойне?
|
|||
|---|---|---|---|
|
#18+
Ничто так не улучшает производительность как перепроектирование. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.10.2006, 11:57 |
|
||
|
Почему не используется индекс при самом обычном джойне?
|
|||
|---|---|---|---|
|
#18+
Используйте конструкцию With и Fetch first засуньте куда-нить внутрь. Чтоб сначала отфильтровалось некоторое число записей, а потому ток джойнилось, а то у вас сначала все выбирается, всё джойнится, а потом ток 2 записи берется. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.10.2006, 12:03 |
|
||
|
Почему не используется индекс при самом обычном джойне?
|
|||
|---|---|---|---|
|
#18+
Что касается ф-ции rownumber(), то лучше их вообще не юзать для приложений , которые должны возвращать данные быстро. Если есть страстное желание пронумеровать записи в запросе, то напишите свою собственную функцию на C. Здесь были примеры подобного рода. Опять же, чтобы ограничивать выборку лучше на самом начальном этапе, и при помощи fetch first. А чтобы добиться правильносй сортировки юзайте ORDER BY ORDER OF. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.10.2006, 12:09 |
|
||
|
Почему не используется индекс при самом обычном джойне?
|
|||
|---|---|---|---|
|
#18+
Какой план запроса у вас при (статистика на индекс LIGAOL.DCM_FV_ENID должна быть заранее собрана): Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.10.2006, 12:12 |
|
||
|
Почему не используется индекс при самом обычном джойне?
|
|||
|---|---|---|---|
|
#18+
Упс! разумеется Код: plaintext ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.10.2006, 12:14 |
|
||
|
Почему не используется индекс при самом обычном джойне?
|
|||
|---|---|---|---|
|
#18+
Выполнился Ваш запрос очень быстро. План вот: план запроса ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.10.2006, 12:32 |
|
||
|
Почему не используется индекс при самом обычном джойне?
|
|||
|---|---|---|---|
|
#18+
VetalВыполнился Ваш запрос очень быстро. План вот: план запроса У тебя сколько записей в таблице, они все помещаются в памяти? - да, зачем тогда индекс использовать. Оптимизатор у нас "умный":) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.10.2006, 13:17 |
|
||
|
Почему не используется индекс при самом обычном джойне?
|
|||
|---|---|---|---|
|
#18+
Alexander Mozhaev VetalВыполнился Ваш запрос очень быстро. План вот: план запроса У тебя сколько записей в таблице, они все помещаются в памяти? - да, зачем тогда индекс использовать. Оптимизатор у нас "умный":) В таблицах по 200 000 записей. Причем в каждой из них есть блоб килобайт так на 10-20... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.10.2006, 13:23 |
|
||
|
Почему не используется индекс при самом обычном джойне?
|
|||
|---|---|---|---|
|
#18+
Попробуй убрать из запроса "where rownumber_ <= 2" и посмотреть план запроса ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.10.2006, 13:29 |
|
||
|
Почему не используется индекс при самом обычном джойне?
|
|||
|---|---|---|---|
|
#18+
Alexander MozhaevПопробуй убрать из запроса "where rownumber_ <= 2" и посмотреть план запроса Выполнил следующий запрос: Код: plaintext 1. 2. 3. план запроса ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.10.2006, 13:35 |
|
||
|
Почему не используется индекс при самом обычном джойне?
|
|||
|---|---|---|---|
|
#18+
А такого: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.10.2006, 13:40 |
|
||
|
Почему не используется индекс при самом обычном джойне?
|
|||
|---|---|---|---|
|
#18+
Ты rownumber_ еще где-то используешь кроме как для отсечения строк? Это тоже самое только без rownumber_ select Document.*, News.* from Document inner join News on Document.dcm_unid=News.dcm_unid order by Document.dcm_viewFrom desc Добавь потом: fetch first 2 rows only ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.10.2006, 13:49 |
|
||
|
Почему не используется индекс при самом обычном джойне?
|
|||
|---|---|---|---|
|
#18+
По моему, план запроса оптимален. Вы хотите вывести все поля из двух таблиц. Серверу дешевле произвести полное сканирование таблицы с последующей сортировкой, нежели обход по индексу и чтение таблицы. Ваш первый план запроса показывает, что самым затратным является не MSJOIN(7), а SORT(11)+SORT(19). Причем, SORT(19) в большей степени. Попробуйте в первой выборке отобрать только поле связывания: Код: plaintext 1. 2. После этого можно сделать выборку всех данных из двух таблиц. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.10.2006, 10:17 |
|
||
|
|

start [/forum/topic.php?fid=43&msg=34041546&tid=1605079]: |
0ms |
get settings: |
8ms |
get forum list: |
12ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
128ms |
get topic data: |
10ms |
get forum data: |
2ms |
get page messages: |
53ms |
get tp. blocked users: |
2ms |
| others: | 217ms |
| total: | 438ms |

| 0 / 0 |
