Низкая производительность Postgres

1. nvv1970 30.09.17 14:53 Сейчас в теме
Имеем ситуацию: БП 2.1 на PostgresPro 9.6. Конфа имеет общий реквизит ОбластьДанныхОсновныеДанные.
Откровенно говоря имею слабые познания в области разделения данных, но речь сейчас об этом лишь косвенно.
Ключевым моментом сабжа является то, что при наличии разделения данных по этому реквизиту, например, ПланСчетов (как и остальные объекты) имеет все индексы с первым полем в составе индекса - общий реквизит. Соответственно primarykey таблицы уже не имеют, а кластерный индекс - это ОбщийРеквизит+Ссылка.
При чтении запросом, например, остатка из регистра бухгалтерии в СУБД отправляется запрос, в котором при соединении таблиц условие по ОбщемуРеквизиту указывается не в условии соединения, а в WHERE. Например так:
INNER JOIN _Acc22 T13
ON T13._IDRRef = T2.AccountRRef
WHERE (T13._Fld773 = 0)
При чем это не единичный случай. Очень похоже, что разделитель (первое поле индекса!) в принципе добавляется исключительно в WHERE.
Для MSSQL это не вызывает никаких трудностей, кластерный индекс (_Fld773 + _IDRRef) планировщик задействует, а вот в Постгресе все очень плохо. Пробуешь ручками добавить условие в соединение (ON T13._IDRRef = T2.AccountRRef AND T13._Fld773 = 0) - запрос "выстреливает".

Собственно вопрос к тем кто сталкивался и имеет опыт:
- способен ли PG на некую "адаптацию" к таким запросам? Конфигом тут не отмажешься. Вроде как есть плагины к PG, оптимизирующие планы, и вроде такой "улучшайзер" используется в Энтерпрайз версии PGpro, но дела не имел и не ясно на что эти плагины способны в принципе и на сколько это рисковано в части прочей производительности и сохранения данных?
- есть наиболее понятные способы модификации через 1с (о поддержке речь не идет и разделение не планируется): отключения разделения данных. Т.е. можно удалить разделители, изменить их свойства, влияющие на состав индексов.
Посоветуйте как правильно это сделать???
Проверил следующее: в режиме независимо кластерный индекс ОР+_IDRRef ; в режиме "независимо и совместимо" кластерный остается, но добавляется уникальный некластерный по _IDRRef. Это уже немного радует, но совсем немного.
Еще есть главный вариант - выключить разделение данных в реквизите (полную реструктуризацию сервер потянет). Вопрос что сломается в типовых модулях БСП?? Все ли останется работоспособным?

Варианты создания индексов в СУБД вручную - не вариант. Их нужно добавлять вообще считай в каждый объект. Разработка проекта активная, каждый день могут быть обновления. Да и почти удвоить количество индексов придется.

PS: остается, пока слабо меня интересующий, но все же вопрос: как же справляться с подобной ситуацией на поддержке или с необходимостью разделения данных?

UP: в ходе тестирования выяснилось, что все не совсем так, как я предполагал. Шапку редактировать не стал. Обо всем ниже в постах.
По теме из базы знаний
Ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
2. starik-2005 3091 30.09.17 16:21 Сейчас в теме
(1) А на сколько быстрее выполняется переписанный запрос? Т.е. на сколько фактически медленнее работает запрос с плохим планом?
3. nvv1970 30.09.17 17:41 Сейчас в теме
(2) Что-то около 3 секунды против 0,9 сек.
База не бог весть какая объемная, но плохие планы начали ощущаться.

Сейчас переключил общий реквизит в "не разделять" - картинка на данном соединении улучшилась, но изменилась в худшую сторону в других местах... Попытка изменять варианты соединений (Nestloop, merge и т.д.) погоду не меняют.
4. starik-2005 3091 30.09.17 19:22 Сейчас в теме
(3) можно попытаться снизить стоимость операций чтения с диска, что заставит оптимизатор постгреса интенсивнее работать с индексами. Также предлагаю кластеризовать соответствующие таблицы, ибо в постгресе нет как такового кластерного индекса - просто по этим полям происходит кластеризация таблицы, при этом новые записи не падают в таблицу в указанном в кластерном индексе порядке. Фактически в MS SQL положение лучше благодаря попытке системы поддерживать структуру таблицы в соответствии с кластерным индексом, но при большом разнообразии данных в INSERT без реструктуризации индексов тоже через какое-то время все начинает лагать, просто объем данных, на котором лаги чувствительны, гораздо выше.
5. nvv1970 30.09.17 21:18 Сейчас в теме
(4)
можно попытаться снизить стоимость операций чтения с диска, что заставит оптимизатор постгреса интенсивнее работать с индексами

С какими параметрами стоит поиграться? Какие значения попробовать?
6. nvv1970 30.09.17 21:24 Сейчас в теме
В целом по подобной ситуации хотел высказаться.
Ведь подобного рода запрос предполагает, что первично соединение, вторично условие where. Если не полагаться на "прозорливость" оптимизаторов, то подобный запрос априори не должен использовать индекс... Так? Это похоже на прокол разработчиков платформы. Было бы добавлено условие в соединение - не возникло бы сомнений в использовании индекса в любой СУБД.
Может имеет смысл написать в багрепорт?
7. starik-2005 3091 30.09.17 23:08 Сейчас в теме
(6) если есть возможность помочь 1С-никам багрепортом - стоит это сделать.


(5) в конфиге есть косты в разделе planer cost constants. Можно поиграться там. Можно enable_sqescan в off установить и посмотреть, меняется ли что-нибудь.
11. nvv1970 01.10.17 19:12 Сейчас в теме
Много всего перелопатил за последние дни в части тестирования запроса получения остатков. Частный запрос, но очень часто повторяемый. Поэтому и уделил ему особое внимание. Кстати замечу еще, что остаток получался на 04-е число августа. На какое-нибудь 25-е все в разы быстрее ))) Это было ожидаемо, т.к. тормозила именно выборка с конца месяца.
Тестировал на 4-5 базах одновременно + MS + PGpro + PS(9.6.3-3.1 c сайта 1с)

Разницы между версиями PG не замечено вообще.
первично соединение, вторично условие where
Похоже я здесь для себя открыл америку. Судя по планам (если конечно же я верно их трактую), прежде чем соединить выборки, СУБД накладывают возможные условия. Т.е. сначала выполняют WHERE (поиск в индексе), а только потом Join (nested loops).
(7)
Можно enable_sqescan в off установить и посмотреть, меняется ли что-нибудь.
В точку. Что-то я полез в COSTы и упустил из виду совет. Начал все подряд менять в надежде получить изменения во времени. Именно на этом параметре и получил положительный результат. Время упало с 2,5-2,8 сек до 1.1-1.2 сек.
Читаю:
Включает или отключает использование планировщиком планов последовательного сканирования.
Т.е. самостоятельно по предполагаемой стоимости выполнения запроса PG не может определить, что полное сканирование будет плохим методом. Может определять это, но не всегда? Или вообще не умеет этого делать???

PS: а еще узнал, что PGadmin показывает время не выполнения запроса, а время с выводом на экран (( А я ему доверял. Поэтому смотреть время только в EXPLAIN ANALYSE (TIMING). Консоли 1с в этом плане правдивее. И очень любопытно то, что в 1с запрос выполняется быстрее чем в pgadmin даже при разборе плана. В 1с 0.8-1.0 сек!! против 1.1-1.2. Разница весьма заметна, не понятно почему.
8. ansh15 30.09.17 23:18 Сейчас в теме
(6) На users.v8.1c.ru, в августе, была выложена тестовая 9.6.3-2.1C, в особенностях релиза которой сообщалось, что "изменен алгоритм работы планировщика запросов", в результате чего "планы запросов выбираются более эффективно" и "в определенных сценариях со сложными запросами" можно наблюдать существенное ускорение их выполнения.
Потом она плавно перешла в актуальную версию с нумерацией релиза 9.6.3-3.1C.
Можно ее попробовать. У нас, в частности, время формирования отчета "Ведомость ОС, НМА"(БГУ) уменьшилось с полутора минут(на предыдущих версиях Pg) до 18 сек, при enable_nestloop=on
9. nvv1970 30.09.17 23:27 Сейчас в теме
(8)
"изменен алгоритм работы планировщика запросов"
Релиз вижу, но откуда такая информация? В описании особенностей релиза про это молчок.
Не обладаю опытом что из версий слона лучше, но повелся на слух, то PGpro для 1с работает веселее. С ней и мучаюсь.
Что ж... Поставим с сайта 1с, оценим.
enable_nestloop=on
в смысле по дефолту? Если параметр отключен, то вроде как ON ??
10. ansh15 30.09.17 23:48 Сейчас в теме
(9)
в смысле по дефолту?

Да. При enable_nestloop=off - меньше секунды на любой версии.

Релиз вижу, но откуда такая информация? В описании особенностей релиза про это молчок.

В особенностях релиза тестовой 9.6.3-2.1C и было. В актуальной почему-то решили не указывать...
20. ansh15 02.12.17 11:27 Сейчас в теме
(9)
Релиз вижу, но откуда такая информация? В описании особенностей релиза про это молчок.

Перенесли сюда - http://downloads.v8.1c.ru/content//Platform/8_3_11_2867/1cv8upd.htm#ce205a21-37b8-11e6-a3f7-0050569f678a
Оптимизирована работа планировщика запросов СУБД PostgreSQL версии 9.6.3
12. starik-2005 3091 02.10.17 19:52 Сейчас в теме
(8) иногда nestad_loop полезно и нужно. Фактически, отключая какой-либо метод выборки для планировщика, в ряде запросов будет выигрыш, а в другом чем-либо может произойти существенный проигрыш.
ansh15; herfis; +2 Ответить
13. emilliya 2 10.10.17 08:57 Сейчас в теме
Интересная тема.

В особенностях релиза PostgreSQL, версия 9.6.3-3.1С,
указано
"Поддержка этой версии в 1С:Предприятии 8.3 реализована в версии 8.3.10 и старше."
У нас работают как 8.3 так и 8.2. под PostgreSQL.

Можно ли это релиз PostgreSQL, версия 9.6.3-3.1С устанавливать в нашем случае?
15. ansh15 10.10.17 12:48 Сейчас в теме
(13)
Для использования PostgreSQL 9.6.3-3.1C с версиями 1С:Предприятия ниже 8.3.10 необходимо его собрать с установленным значением параметра integer_datetimes=off
- оттуда же.
На одном экземпляре PostgreSQL работать и в 8.2 и в 8.3 не получится. Нужно будет два экзепляра - один, собранный с integer_datetimes=off, для 8.2, другой, собранный с integer_datetimes=on, для 8.3.
Или переводить все конфигурации на 8.3.
emilliya; +1 Ответить
16. emilliya 2 10.10.17 13:20 Сейчас в теме
(15) Последняя версия, в особенностях которой ничего не написано про версии ниже 8.3 -
9.1.9-1.1C.

Нормальная ли это версия, подскажите, пожалуйста?
17. ansh15 10.10.17 16:35 Сейчас в теме
(16)В свое время на ней и 1С 8.2 работали, каких-то серьезных проблем и ошибок замечено не было. Был(как помнится) момент, если загружать dt-файл в не пустую базу, то даже на небольших базах(5-10 ГБ) процесс мог длиться минут 15-20, В пустую же базу dt загружался весьма быстро. При работе с последующими версиями PostgreSQL такого уже не наблюдалось.
18. emilliya 2 12.10.17 08:37 Сейчас в теме
(15)
Спасибо за ответ!
Подскажите, пожалуйста,
2 экземпляра -
это значит установить еще одни новый PostGree на новый порт и к нему подключить базы 8.3, базы 8.2 оставить у прежнего PostGree
или
установить новый PostGree, старый убрать, к новому подключить все базы,
но вызывать каким-то образом 2 службы с разными параметрами?
19. ansh15 13.10.17 02:36 Сейчас в теме
(18)
это значит установить еще одни новый PostGree на новый порт и к нему подключить базы 8.3, базы 8.2 оставить у прежнего PostGree

Да
emilliya; +1 Ответить
14. herfis 513 10.10.17 10:05 Сейчас в теме
Вроде все еще грустнее.
Я не настоящий сварщик, но ЕМНИП в postgresql вообще нет кластерных индексов в понимании MSSQL (есть только разовые операции упорядочивания данных таблицы по "кластерному" индексу).
Т.е. даже при удачном фуллскане по якобы кластеризованному индексу, при необходимости доступа к полям не указанным в индексе - будут дополнительные расходы, в отличие от MSSQL.
Оставьте свое сообщение

Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот