Этот баннер — требование Роскомнадзора для исполнения 152 ФЗ.
«На сайте осуществляется обработка файлов cookie, необходимых для работы сайта, а также для анализа использования сайта и улучшения предоставляемых сервисов с использованием метрической программы Яндекс.Метрика. Продолжая использовать сайт, вы даёте согласие с использованием данных технологий».
Политика конфиденциальности
|
|
|
Разное время выполнения почти одинаковых запросов
|
|||
|---|---|---|---|
|
#18+
Доброго времени суток. Столкнулся с проблемой, с которой бьюсь уже две недели и все решения которые приходили на ум не приносят результата. Итак. Есть две таблицы. В первой хранятся записи об изменении денег юзера: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. В таблице pays дополнительно создан индекс по полю SessionID (тип индекса BTree). Теперь задача следующая: зная UserID подсчитать все его сессии. Используем такой запрос: Код: plaintext Далее начинается шаманство: для некоторых UserID запрос выполняется в доли секунды, для других от 1 до 2.5 секунд. Делаем EXPLAIN ANALYZE для двух разных случаев: Быстрое выполнение Код: 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. Принципиальное различие между пользователями с UserID 2 и 1 состоит в том, что у юзера UserID=2 (быстрого) записей в таблице сессий 136, а у юзера UserID=1(медленного) записей 2786. Но тем не менее разница во времени выолнения запросов составляет 2 порядка. Конфигурация машины: AMD Athlon 2800+, 512 Mb RAM, SATA RAID 0+1 ПО: FreeBSD 6.0, PostgreSQL 8.1.2 Размеры таблиц: Sessions - 7606 записей (1 613 Кбайт), Pays - 1 030 350 записей (196 222 Кбайт) В чем может быть проблема столь большой разницы в выполнении запросов? Что можно сделать чтобы ускорить медленные запросы? Куда копать? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.10.2006, 11:57 |
|
||
|
Разное время выполнения почти одинаковых запросов
|
|||
|---|---|---|---|
|
#18+
В одном случае у тебя условию удовлетворяют 629 записей, а в другом - свыше миллиона. Вот тебе и разница во времени. ===================================== Страну, в которой все ходят на бровях, на колени не поставишь... ===================================== ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.10.2006, 12:15 |
|
||
|
Разное время выполнения почти одинаковых запросов
|
|||
|---|---|---|---|
|
#18+
И как лечить? Как заставить сервер БД выполнять запрос быстрее? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.10.2006, 12:17 |
|
||
|
Разное время выполнения почти одинаковых запросов
|
|||
|---|---|---|---|
|
#18+
RussianSpyИ как лечить? Как заставить сервер БД выполнять запрос быстрее? Почему не показано, какие индексы использованы? Это ж самое главное в данном случае! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.10.2006, 12:28 |
|
||
|
Разное время выполнения почти одинаковых запросов
|
|||
|---|---|---|---|
|
#18+
Гм. Если ему для выполнения условия надо перебрать миллион записей - то ты ему не поможешь. ===================================== Страну, в которой все ходят на бровях, на колени не поставишь... ===================================== ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.10.2006, 12:29 |
|
||
|
Разное время выполнения почти одинаковых запросов
|
|||
|---|---|---|---|
|
#18+
ilejn RussianSpyИ как лечить? Как заставить сервер БД выполнять запрос быстрее? Почему не показано, какие индексы использованы? Это ж самое главное в данном случае! Все там показано. В первом случае: Код: plaintext Код: plaintext Остальное несущественно. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.10.2006, 12:35 |
|
||
|
Разное время выполнения почти одинаковых запросов
|
|||
|---|---|---|---|
|
#18+
ilejnПочему не показано, какие индексы использованы? Это ж самое главное в данном случае! Про индексы написано у меня. В таблице pays дополнительно создан индекс по полю SessionID (тип индекса BTree). Кувалдин Роман Гм. Если ему для выполнения условия надо перебрать миллион записей - то ты ему не поможешь. почему же в таком случае один запрос выполняется 13 мсек, а второй почти в 200 раз медленнее? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.10.2006, 12:37 |
|
||
|
Разное время выполнения почти одинаковых запросов
|
|||
|---|---|---|---|
|
#18+
Попробуй вот такой запрос: Код: plaintext Ну и план покажи. ===================================== Страну, в которой все ходят на бровях, на колени не поставишь... ===================================== ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.10.2006, 12:40 |
|
||
|
Разное время выполнения почти одинаковых запросов
|
|||
|---|---|---|---|
|
#18+
А потом вот этот: Код: plaintext ===================================== Страну, в которой все ходят на бровях, на колени не поставишь... ===================================== ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.10.2006, 12:58 |
|
||
|
Разное время выполнения почти одинаковых запросов
|
|||
|---|---|---|---|
|
#18+
Кувалдин РоманПопробуй вот такой запрос: Код: plaintext Ну и план покажи. Запрос возвратил 2619 (это тестер работает - потому количество записей подрастает) Вот план: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. Собственно случай с UserID=2 - это случай быстрого выполнения. Вот тоже самое для UserID=1 - медленный случай Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. Код: plaintext 1. 2. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.10.2006, 12:58 |
|
||
|
Разное время выполнения почти одинаковых запросов
|
|||
|---|---|---|---|
|
#18+
Попробуйте "vacuum analyze", "set enable merge_join to off". Планы разные из-за того что постгрес предполагает, что при условии userid=2 после join-а получится 16779 строк, а для userid=1 - 368193 строк. PS. Кувалдин РоманВ одном случае у тебя условию удовлетворяют 629 записей, а в другом - свыше миллиона.Не так. Миллион строк во втором плане - без ограничения по sessionid. Кувалдин РоманГм. Если ему для выполнения условия надо перебрать миллион записей - то ты ему не поможешь.Не обязательно перебирать миллион записей. RussianSpyпочему же в таком случае один запрос выполняется 13 мсек, а второй почти в 200 раз медленнее?Потому что постгрес выбрал разные планы запросов. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.10.2006, 13:11 |
|
||
|
Разное время выполнения почти одинаковых запросов
|
|||
|---|---|---|---|
|
#18+
Делал VACUUM ANALYZE, VACUUM FULL ANALYZE Делал REINDEX... Не помогает... Постгрес в двух почти одинаковых случаях выбирает разные планы... Вот это мне лично непонятно. Как вообще можно влиять на это? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.10.2006, 13:13 |
|
||
|
Разное время выполнения почти одинаковых запросов
|
|||
|---|---|---|---|
|
#18+
LeXa NalBat Кувалдин РоманГм. Если ему для выполнения условия надо перебрать миллион записей - то ты ему не поможешь.Не обязательно перебирать миллион записей. Возвращаемся к спору в соседнем топике: как в версионнике, не перебирая таблицы, узнать, сколько строк входят в данное условие... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.10.2006, 13:14 |
|
||
|
Разное время выполнения почти одинаковых запросов
|
|||
|---|---|---|---|
|
#18+
RussianSpyДелал VACUUM ANALYZE, VACUUM FULL ANALYZE Делал REINDEX... Не помогает... Постгрес в двух почти одинаковых случаях выбирает разные планы... Вот это мне лично непонятно. Как вообще можно влиять на это? Стоимость каждого плана. Есть у меня сильное подозрение, что nested loops для 2786 записей не выполняется в силу конструктивных ограничений. Кто-нибудь помнит, какова глубина рекурсии в plpgsql-функциях? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.10.2006, 13:16 |
|
||
|
Разное время выполнения почти одинаковых запросов
|
|||
|---|---|---|---|
|
#18+
RussianSpyКак вообще можно влиять на это?добиваться предпочтительного с вашей точки зрения плана можно с помощью: 1. vacuum analyze 2. set enable_... 3. тюнить константы влияющие на планировщик: random_page_cost и др. (см. доку) 4. искать ляпы в сборщике статистики, планировщике и писать баг-репорты Кувалдин РоманЕсть у меня сильное подозрение, что nested loops для 2786 записей не выполняется в силу конструктивных ограничений.Nested Loop возможен для 2786 записей. Кувалдин Роман LeXa NalBat Кувалдин РоманГм. Если ему для выполнения условия надо перебрать миллион записей - то ты ему не поможешь.Не обязательно перебирать миллион записей.Возвращаемся к спору в соседнем топике: как в версионнике, не перебирая таблицы, узнать, сколько строк входят в данное условие...Не вижу связи между темой версионник-блокировочник и данной. Чтобы не захламлять этот топик, можно создать рядом, я попробую ответить на ваши вопросы. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.10.2006, 13:30 |
|
||
|
Разное время выполнения почти одинаковых запросов
|
|||
|---|---|---|---|
|
#18+
LeXa NalBatдобиваться предпочтительного с вашей точки зрения плана можно с помощью: 1. vacuum analyze 2. set enable_... Вот с такими условиями скорость выполнения запроса стала нормальной: Код: plaintext 1. 2. 3. Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. Спасибо огромное за советы. Возможно метод кривой, но тем не менее удалось ускорить выполнение запроса в 220 раз, а это того стоит. ЗЫ Признаться честно я не знал о таких вещах как set enable_hashjoin =off. Теперь внимательно прочту п.17.6 официального мануала. ;-) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.10.2006, 13:45 |
|
||
|
Разное время выполнения почти одинаковых запросов
|
|||
|---|---|---|---|
|
#18+
RussianSpyПризнаться честно я не знал о таких вещах как set enable_hashjoin =off.Возможно, удастся подкрутить константы random_page_cost и др (это кропотливое занятие), и необходимость в set enable отпадет, постгрес сразу будет выбирать "правильный" план. Мы эти константы подкручивали. Как написано в migration 8.2, при переходе на версию 8.2 их скорее всего придется "перекручивать". ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.10.2006, 13:51 |
|
||
|
Разное время выполнения почти одинаковых запросов
|
|||
|---|---|---|---|
|
#18+
Не совет, а скорее из любопытства: если попробовать (без подкрутки enable_*) следующий запрос: Код: plaintext что-нибудь изменится? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.10.2006, 14:16 |
|
||
|
Разное время выполнения почти одинаковых запросов
|
|||
|---|---|---|---|
|
#18+
Andrew SagulinНе совет, а скорее из любопытства: если попробовать (без подкрутки enable_*) следующий запрос: Код: plaintext что-нибудь изменится? Да изменилось...в худшую сторону Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.10.2006, 14:29 |
|
||
|
|

start [/forum/topic.php?fid=53&msg=34028482&tid=2006061]: |
0ms |
get settings: |
8ms |
get forum list: |
19ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
61ms |
get topic data: |
9ms |
get forum data: |
3ms |
get page messages: |
55ms |
get tp. blocked users: |
2ms |
| others: | 249ms |
| total: | 414ms |

| 0 / 0 |
