Этот баннер — требование Роскомнадзора для исполнения 152 ФЗ.
«На сайте осуществляется обработка файлов cookie, необходимых для работы сайта, а также для анализа использования сайта и улучшения предоставляемых сервисов с использованием метрической программы Яндекс.Метрика. Продолжая использовать сайт, вы даёте согласие с использованием данных технологий».
Политика конфиденциальности
|
|
|
Помогите создать индексы к запросу
|
|||
|---|---|---|---|
|
#18+
Есть несколько таблиц: s_c.selected_parameters_values as tab1, s_f.messages_titles as tab2, s_c.categories_data as tab3, s_c.data_sources as tab4, s_c.id_messages_direction_types as tab5, s_c.messages_settings as tab6. (s_c, s_f - схемы) Есть запрос Код: plsql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. Работ происходит с базой на 3 миллиона записей. Первоначально создал индексы btree для таблицы s_f.messages_titles: (id, arrive_date), (id), (arrive_date); для таблицы s_content.selected_parameters_values:(id). Этот запрос без ORDER BY tab2.arrive_date работает от 60 до 70 ms (это меня устраивает). Но всё дело в "ORDER BY tab2.arrive_date" (тип поля t_timestamp), из-за этого жутко тормозит и запрос выполняется с 2.45 до 3.10 минут. Прошу помочь ускорить данный запрос связанный с "ORDER BY tab2.arrive_date". Из Join-ов видно информацию о ключах таблиц. (т.е. если поле называется id - это PK для этой таблицы) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.11.2016, 10:31 |
|
||
|
Помогите создать индексы к запросу
|
|||
|---|---|---|---|
|
#18+
Дополнительная информация от планировщика вот: Это данные о плане к запросу без "ORDER BY tab2.arrive_date". "Limit (cost=1.28..288.48 rows=100 width=298) (actual time=0.038..0.518 rows=100 loops=1)" " -> Nested Loop Left Join (cost=1.28..9229252.03 rows=3213492 width=298) (actual time=0.038..0.514 rows=100 loops=1)" " -> Nested Loop Left Join (cost=1.14..8682938.49 rows=3213492 width=173) (actual time=0.036..0.414 rows=100 loops=1)" " Join Filter: ((id_message_headerid_messages_direction_types20.id)::bigint = (selected_parameters_valuesid_message_header10.id_messages_direction_types)::bigint)" " Rows Removed by Join Filter: 99" " -> Nested Loop Left Join (cost=1.14..8586532.70 rows=3213492 width=155) (actual time=0.017..0.365 rows=100 loops=1)" " -> Nested Loop Left Join (cost=1.00..8064328.31 rows=3213492 width=137) (actual time=0.016..0.293 rows=100 loops=1)" " -> Nested Loop Left Join (cost=0.86..7526052.40 rows=3213492 width=93) (actual time=0.014..0.212 rows=100 loops=1)" " -> Index Scan using selected_parameters_values_id_idx on selected_parameters_values selected_parameters_values0 (cost=0.43..128967.81 rows=3213492 width=61) (actual time=0.007..0.021 rows=100 loops=1)" " -> Index Scan using messages_titles_id_idx on messages_titles selected_parameters_valuesid_message_header10 (cost=0.43..2.29 rows=1 width=48) (actual time=0.001..0.001 rows=1 loops=100)" " Index Cond: ((id)::bigint = (selected_parameters_values0.id_message_header)::bigint)" " -> Index Scan using categories_data_pkey on categories_data selected_parameters_valuesdata_category10 (cost=0.14..0.16 rows=1 width=52) (actual time=0.001..0.001 rows=1 loops=100)" " Index Cond: ((id)::bigint = (selected_parameters_values0.data_category)::bigint)" " -> Index Scan using data_sources_pkey on data_sources id_message_headerarm20 (cost=0.14..0.15 rows=1 width=26) (actual time=0.001..0.001 rows=1 loops=100)" " Index Cond: ((id)::bigint = (selected_parameters_valuesid_message_header10.arm)::bigint)" " -> Materialize (cost=0.00..1.03 rows=2 width=26) (actual time=0.000..0.000 rows=2 loops=100)" " -> Seq Scan on id_messages_direction_types id_message_headerid_messages_direction_types20 (cost=0.00..1.02 rows=2 width=26) (actual time=0.015..0.015 rows=2 loops=1)" " -> Index Scan using messages_settings_pkey on messages_settings id_message_headerid_message_settings20 (cost=0.14..0.16 rows=1 width=40) (actual time=0.001..0.001 rows=1 loops=100)" " Index Cond: ((id)::bigint = (selected_parameters_valuesid_message_header10.id_message_settings)::bigint)" "Planning time: 1.041 ms" "Execution time: 0.596 ms" Это данные о плане к запросу с "ORDER BY tab2.arrive_date". "Limit (cost=1210933.88..1210934.13 rows=100 width=298) (actual time=182684.346..182684.355 rows=100 loops=1)" " -> Sort (cost=1210933.88..1218967.61 rows=3213492 width=298) (actual time=182684.343..182684.346 rows=100 loops=1)" " Sort Key: selected_parameters_valuesid_message_header10.arrive_date" " Sort Method: top-N heapsort Memory: 76kB" " -> Hash Left Join (cost=152340.48..1088116.53 rows=3213492 width=298) (actual time=29886.328..179857.756 rows=3213585 loops=1)" " Hash Cond: ((selected_parameters_valuesid_message_header10.id_message_settings)::bigint = (id_message_headerid_message_settings20.id)::bigint)" " -> Hash Left Join (cost=152335.17..1043925.70 rows=3213492 width=173) (actual time=29886.276..177754.236 rows=3213585 loops=1)" " Hash Cond: ((selected_parameters_valuesid_message_header10.id_messages_direction_types)::bigint = (id_message_headerid_messages_direction_types20.id)::bigint)" " -> Hash Left Join (cost=152334.12..999739.14 rows=3213492 width=155) (actual time=29886.260..176294.504 rows=3213585 loops=1)" " Hash Cond: ((selected_parameters_valuesid_message_header10.arm)::bigint = (id_message_headerarm20.id)::bigint)" " -> Hash Left Join (cost=152332.81..955601.58 rows=3213492 width=137) (actual time=29886.237..174848.419 rows=3213585 loops=1)" " Hash Cond: ((selected_parameters_values0.data_category)::bigint = (selected_parameters_valuesdata_category10.id)::bigint)" " -> Hash Right Join (cost=152329.57..911412.82 rows=3213492 width=93) (actual time=29886.174..173382.564 rows=3213585 loops=1)" " Hash Cond: ((selected_parameters_valuesid_message_header10.id)::bigint = (selected_parameters_values0.id_message_header)::bigint)" " -> Seq Scan on messages_titles selected_parameters_valuesid_message_header10 (cost=0.00..615495.36 rows=3228636 width=48) (actual time=0.019..83581.593 rows=3228678 loops=1)" " -> Hash (cost=77640.92..77640.92 rows=3213492 width=61) (actual time=29865.390..29865.390 rows=3213585 loops=1)" " Buckets: 65536 Batches: 128 Memory Usage: 2882kB" " -> Seq Scan on selected_parameters_values selected_parameters_values0 (cost=0.00..77640.92 rows=3213492 width=61) (actual time=0.031..25909.846 rows=3213585 loops=1)" " -> Hash (cost=2.55..2.55 rows=55 width=52) (actual time=0.047..0.047 rows=55 loops=1)" " Buckets: 1024 Batches: 1 Memory Usage: 13kB" " -> Seq Scan on categories_data selected_parameters_valuesdata_category10 (cost=0.00..2.55 rows=55 width=52) (actual time=0.015..0.024 rows=55 loops=1)" " -> Hash (cost=1.14..1.14 rows=14 width=26) (actual time=0.018..0.018 rows=14 loops=1)" " Buckets: 1024 Batches: 1 Memory Usage: 9kB" " -> Seq Scan on data_sources id_message_headerarm20 (cost=0.00..1.14 rows=14 width=26) (actual time=0.009..0.012 rows=14 loops=1)" " -> Hash (cost=1.02..1.02 rows=2 width=26) (actual time=0.012..0.012 rows=2 loops=1)" " Buckets: 1024 Batches: 1 Memory Usage: 9kB" " -> Seq Scan on id_messages_direction_types id_message_headerid_messages_direction_types20 (cost=0.00..1.02 rows=2 width=26) (actual time=0.007..0.007 rows=2 loops=1)" " -> Hash (cost=4.03..4.03 rows=103 width=40) (actual time=0.045..0.045 rows=103 loops=1)" " Buckets: 1024 Batches: 1 Memory Usage: 16kB" " -> Seq Scan on messages_settings id_message_headerid_message_settings20 (cost=0.00..4.03 rows=103 width=40) (actual time=0.007..0.023 rows=103 loops=1)" "Planning time: 0.941 ms" "Execution time: 182684.838 ms" ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.11.2016, 10:40 |
|
||
|
Помогите создать индексы к запросу
|
|||
|---|---|---|---|
|
#18+
Alexander Krasny, приведите план запроса в читаемом виде (т.е. со всеми отступами), который выдает psql и оберните его в тег src. и покажите, какие индексы есть в s_f.messages_titles. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.11.2016, 11:08 |
|
||
|
Помогите создать индексы к запросу
|
|||
|---|---|---|---|
|
#18+
Alexius, Первоначально создал индексы btree для таблицы s_f.messages_titles: (id, arrive_date), (id), (arrive_date); Писал выше) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.11.2016, 11:27 |
|
||
|
Помогите создать индексы к запросу
|
|||
|---|---|---|---|
|
#18+
Alexius, Код: sql 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. 31. 32. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.11.2016, 11:35 |
|
||
|
Помогите создать индексы к запросу
|
|||
|---|---|---|---|
|
#18+
Alexander Krasny, вот план планировщика с ORDER BY tab2.arrive_date. И небольшая оговорка: я сократил имя схем (s_content = s_c, s_fast = s_f) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.11.2016, 11:37 |
|
||
|
Помогите создать индексы к запросу
|
|||
|---|---|---|---|
|
#18+
Alexander Krasny, А переделайте его как (я не причесывал имена полей... идея понятна) Код: plsql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. Суть в том чтобы СНАЧАЛА подсчитать нужные вам 100 строк из tab1/tab2 а потом уже к ним цеплять все остальное. -- Maxim Boguk www.postgresql-consulting.ru ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.11.2016, 11:40 |
|
||
|
Помогите создать индексы к запросу
|
|||
|---|---|---|---|
|
#18+
Maxim Boguk, дальше можно брать 100 строк из полного джойна, смешать со 100 строками из антиджойна и отсортировать/отлимитить (а потом слева навесить оставшееся). не думаю, что оптимайзер пж такое сумеет сам (обычно такие простейшие выкладки ему не доступны). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.11.2016, 12:03 |
|
||
|
Помогите создать индексы к запросу
|
|||
|---|---|---|---|
|
#18+
qwwqMaxim Boguk, дальше можно брать 100 строк из полного ( INNER, not FULL) джойна, смешать со 100 строками из антиджойна и отсортировать/отлимитить (а потом слева навесить оставшееся). не думаю, что оптимайзер пж такое сумеет сам (обычно такие простейшие выкладки ему не доступны). -- поправил ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.11.2016, 12:05 |
|
||
|
Помогите создать индексы к запросу
|
|||
|---|---|---|---|
|
#18+
Maxim Boguk, большое спасибо, я сегодня же это попробую. Тогда задам еще вопрос, может нужны какие-то индексы еще? И правильно ли я понял, что мои индексы планировщик игнорит? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.11.2016, 13:42 |
|
||
|
Помогите создать индексы к запросу
|
|||
|---|---|---|---|
|
#18+
Alexander KrasnyMaxim Boguk, большое спасибо, я сегодня же это попробую. Тогда задам еще вопрос, может нужны какие-то индексы еще? И правильно ли я понял, что мои индексы планировщик игнорит? А чем ваши индексы могут помочь для основного блока запроса? Когда у вас сортировка по полям из 2х таблиц идет. Кстати у вас там точно left join между s_c.selected_parameters_values и s_f.messages_titles а не inner join? Как то очень странно видеть запрос с первым полем в сортировке из левой стороны left join. -- Maxim Boguk www.postgresql-consulting.ru ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.11.2016, 14:17 |
|
||
|
Помогите создать индексы к запросу
|
|||
|---|---|---|---|
|
#18+
Maxim Boguk, я просто намеревался с помощью индексов хоть как-то улучшить скорость. Поймите, я новичёк в таких интересных вещах.. В универе меня научили лишь делать представления, процедуры, функции, тригеры, таблицы, как с правами пользователя обращаться. Но вот таких неординарных вещей нам не объясняли.. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.11.2016, 17:57 |
|
||
|
Помогите создать индексы к запросу
|
|||
|---|---|---|---|
|
#18+
Maxim BogukКстати у вас там точно left join между s_c.selected_parameters_values и s_f.messages_titles а не inner join? Как то очень странно видеть запрос с первым полем в сортировке из левой стороны left join. Я еще разберусь в структуре, может ли у меня поле id_message_header из s_c.selected_parameters_values быть пустым. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.11.2016, 18:01 |
|
||
|
Помогите создать индексы к запросу
|
|||
|---|---|---|---|
|
#18+
Maxim Boguk, воспользовался вашим советом. Получилось что-то такое: Код: plsql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. Скорость выполнения такого улучшилась где-то от 8 до 10 секунд. Может стоит попробовать сделать то же и с остальными LEFT JOIN-ами? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.11.2016, 13:13 |
|
||
|
Помогите создать индексы к запросу
|
|||
|---|---|---|---|
|
#18+
Maxim Boguk, вот план планировщика Код: sql 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. 31. 32. 33. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.11.2016, 13:29 |
|
||
|
Помогите создать индексы к запросу
|
|||
|---|---|---|---|
|
#18+
Maxim Boguk, ускорил, отключив seqscan на 5 секунд. План планировщика такой: Код: sql 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. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.11.2016, 13:38 |
|
||
|
Помогите создать индексы к запросу
|
|||
|---|---|---|---|
|
#18+
попробуйте как--то так Код: plsql 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. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.11.2016, 13:54 |
|
||
|
Помогите создать индексы к запросу
|
|||
|---|---|---|---|
|
#18+
qwwq, скобок унутре добавьте только, обсчитался ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.11.2016, 13:56 |
|
||
|
Помогите создать индексы к запросу
|
|||
|---|---|---|---|
|
#18+
qwwq, ЩА ПОПробую)) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.11.2016, 13:57 |
|
||
|
Помогите создать индексы к запросу
|
|||
|---|---|---|---|
|
#18+
qwwq, мне непонятны комментарии ваши в коде( ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.11.2016, 13:58 |
|
||
|
Помогите создать индексы к запросу
|
|||
|---|---|---|---|
|
#18+
qwwq, поясните пожалуйста, для меня ламера, где не хватает скобки в вашем запросе( Я скопировал, попробовал так, так, так... Не получается ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.11.2016, 14:12 |
|
||
|
Помогите создать индексы к запросу
|
|||
|---|---|---|---|
|
#18+
qwwqпопробуйте как--то так Код: plsql 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. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. примерно так комментарии означают комментарии. хинтов в пж не бывает. например Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. можно попробовать загнать руками на (вероятно) правильный план примерно так Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.11.2016, 14:23 |
|
||
|
Помогите создать индексы к запросу
|
|||
|---|---|---|---|
|
#18+
qwwq, откуда невооруженным глазом видим, что напрашивается индекс по tab1 (id_message_header,id) (или применение хенджобной техники а--ля лузиндекскан -- для быстрого обрезания сорта вдоль неуникального инд--а с уникализирующим постфиксом в ордербай--листе -- чего пж сам не умеет, помнится) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.11.2016, 14:30 |
|
||
|
Помогите создать индексы к запросу
|
|||
|---|---|---|---|
|
#18+
qwwq, правильно ли я понял вас: Код: plsql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.11.2016, 14:32 |
|
||
|
Помогите создать индексы к запросу
|
|||
|---|---|---|---|
|
#18+
Alexander Krasnyqwwq, правильно ли я понял вас: почти вы потеряли второй компонент юнион-олла. в юнионе у вас д.б. 100 (или менее) записей из полного джойна т1 т2 и остаток (не более 100) -- из аниджойна т1 т2. всё смешать и отсортировать по новой. вот остаток вы и потеряли. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.11.2016, 14:48 |
|
||
|
|

start [/forum/topic.php?fid=53&msg=39345577&tid=1996875]: |
0ms |
get settings: |
11ms |
get forum list: |
15ms |
check forum access: |
5ms |
check topic access: |
5ms |
track hit: |
166ms |
get topic data: |
13ms |
get forum data: |
3ms |
get page messages: |
61ms |
get tp. blocked users: |
2ms |
| others: | 300ms |
| total: | 581ms |

| 0 / 0 |
