Size: a a a

pgsql – PostgreSQL

2021 February 02

YS

Yaroslav Schekin in pgsql – PostgreSQL
Oleg Bartunov
Мы взяли ispell-кие словари для морфологии от бедности. Буду рад, если кто возьмется за создание нормального морфологического словаря.
А брать-то больше почти и нечего...

Есть, впрочем, существенно доработанный/переработанный (но тоже уже брошенный, к сожалению) Александром Клюквиным словарь Лебедева (и он всё ещё качественнее, чем "обновляемый" от AOT group, по моему нескромному мнению ;) ). Но на этом и всё.

> Буду рад, если кто возьмется за создание нормального морфологического словаря.

Да, неплохо бы... только это большая работа, пойди найди энтузиастов. ;)
А вообще, опять-таки, AOT group тихо и незаметно "подложила свинью" всем русскоязычным пользователям проверки правописания и FTS (потому что почти все берут их словари).
источник

YS

Yaroslav Schekin in pgsql – PostgreSQL
Igor Chizhov
Поднял shared_buffers до 36 Гб при оперативе 48Гб. Получил гораздо лучше результаты, чем при 8-12 Гб.
Но не даёт мне покоя мысль про выстрел в ногу )))

Мой кейс - это аналитическая БД. Две денормализованных витрины 10 Гб и 12 Гб. Обновление витрин небольшими порциями 1 раз в 3 часа (DELETE + INSERT).
К витринам подключена BI-система, которая шлет множество запросов в БД (отчеты с Live Connection, 10-12 сессий на пользователя). Каждый запрос обернут в курсор with hold (пробую бороться с этим, пока оживил запросы поднятием сursor_tuple_fraction до 0.9). Изначально всё это хозяйство жило в GreenPlum, но осилить поток в сотни мелких запросов не вышло.

Какие риски 75% shared_buffers в моем случае?
> Получил гораздо лучше результаты, чем при 8-12 Гб.

Ожидаемо, да.

> Какие риски 75% shared_buffers в моем случае?

Ну... могут иногда какие-то запросы [временно] выдавать ошибки при нехватке памяти (если уже выполнены базовые настройки).
Перезапустятся, большое дело — а настройки можно под них "подточить". ;)
источник

YS

Yaroslav Schekin in pgsql – PostgreSQL
Oleg Bartunov
Мы взяли ispell-кие словари для морфологии от бедности. Буду рад, если кто возьмется за создание нормального морфологического словаря.
И всё-таки мне любопытно, какими для "идеального" FTS должны быть ответы на вопросы про опечатки и "левые" (редкие и т.п., см. выше) слова. ;)
источник

IC

Igor Chizhov in pgsql – PostgreSQL
Victor Yegorov
1. аналитическим запросам нужна память. нужно следить, чтобы shared_buffers + сессии * work_mem было бы в пределах доступной памяти, чтобы не призвать OOM.
2. вам следует посмотреть как себя чувствуют чекпойнты при таких shared_buffers, у меня был кейс, когда дискам и системе было легче при низком значении shared_buffers, т.к. запросы всё равно много читали с дисков при любых shared_buffers
1. work_mem стоит дефолтное (4Мб), ограничение в 1000 сессий, в реале ожидаю не более 300-400 одновременно. PgBouncer в режиме Transaction, на вид отрабатывает нормально. Т.е. 36 + 4 Гб в текущем раскладе.
2. Вот чтения с диска у меня вообще практически нет. Чекпойнты не смотрел. Сейчас посмотрел SELECT * FROM pg_stat_bgwriter, но там статистика с декабря 2020. Я так думаю, что нужно её сбросить и посмотреть на текущую картину?
источник

VY

Victor Yegorov in pgsql – PostgreSQL
1. аналитика на 4MB? у вас временные файлы пишутся?

2. да, я бы сбросил, сделал руками один чекпойнт и смотрел бы таким запросом (в нём нет проверки деления на ноль, поэтому нужен чекпойнт, запускать в psql ) :

SELECT round(100.0*checkpoints_req/checkpoints,1)                                                  "Forced checkpoint ratio (%)",
      round(min_since_reset/checkpoints,2)                                                        "Minutes between checkpoints",
      round(checkpoint_write_time::numeric/(checkpoints*1000),2)                                  "Average write time per checkpoint (s)",
      round(checkpoint_sync_time::numeric/(checkpoints*1000),2)                                   "Average sync time per checkpoint (s)",
      round(total_buffers/128.0,1)                                                                "Total MB written",
      round(buffers_checkpoint/(128.0*checkpoints),2)                                             "MB per checkpoint",
      round(buffers_checkpoint/(128.0*min_since_reset*60),2)                                      "Checkpoint MBps",
      round(buffers_clean/(128.0*min_since_reset*60),2)                                           "`bgwriter` MBps",
      round(buffers_backend/(128.0*min_since_reset*60),2)                                         "Backend MBps",
      round(total_buffers/(128.0*min_since_reset*60),4)                                           "Total MBps",
      round(100.0*buffers_checkpoint/total_buffers,1)                                             "Clean by checkpoints (%)",
      round(100.0*buffers_clean/total_buffers,1)                                                  "Clean by `bgwriter` (%)",
      round(100.0*buffers_backend/total_buffers,1)                                                "Clean by backends (%)",
      round(100.0*maxwritten_clean/(min_since_reset*60000/bgwriter_delay),2)                      "`bgwriter` halt-only length (buffers)",
      coalesce(round(100.0*maxwritten_clean/(nullif(buffers_clean,0)/bgwriter_lru_maxpages),2),0) "`bgwriter` halt ratio (%)",
      round(1.0*buffers_alloc/total_buffers,3)                                                    "New buffer allocation ratio",
      min_since_reset                                                                             "Minutes since reset",
      now()-pg_postmaster_start_time()                                                            "Uptime",
      '-------'                                                                                   "-------------------------------------",
      *
 FROM (
   SELECT checkpoints_timed,
          checkpoints_req,
          checkpoints_timed + checkpoints_req checkpoints,
          checkpoint_sync_time,
          checkpoint_write_time,
          buffers_checkpoint,
          buffers_clean,
          maxwritten_clean,
          buffers_backend,
          buffers_backend_fsync,
          buffers_alloc,
          buffers_checkpoint + buffers_clean + buffers_backend total_buffers,
          pg_postmaster_start_time() startup,
          stats_reset,
          round(extract('epoch' from now() - stats_reset)/60)::numeric min_since_reset,
          delay.setting::numeric bgwriter_delay,
          lru.setting::numeric bgwriter_lru_maxpages,
          ratio.setting::numeric bgwriter_lru_multiplier,
          ckpt_s.setting::numeric max_wal_size,
          ckpt_t.setting::numeric checkpoint_timeout
     FROM pg_stat_bgwriter
     JOIN pg_settings lru   ON lru.name = 'bgwriter_lru_maxpages'
     JOIN pg_settings delay ON delay.name = 'bgwriter_delay'
     JOIN pg_settings ratio ON ratio.name = 'bgwriter_lru_multiplier'
     JOIN pg_settings ckpt_s ON ckpt_s.name = 'max_wal_size'
     JOIN pg_settings ckpt_t ON ckpt_t.name = 'checkpoint_timeout'
       ) bgstats\gx
источник

IC

Igor Chizhov in pgsql – PostgreSQL
Yaroslav Schekin
> Получил гораздо лучше результаты, чем при 8-12 Гб.

Ожидаемо, да.

> Какие риски 75% shared_buffers в моем случае?

Ну... могут иногда какие-то запросы [временно] выдавать ошибки при нехватке памяти (если уже выполнены базовые настройки).
Перезапустятся, большое дело — а настройки можно под них "подточить". ;)
К счастью, все запросы более-менее известны. База используется исключительно приложением, с ad-hoc туда не лезут в принципе, для этого есть GreenPlum.
источник

ik

ilya krasnoperov in pgsql – PostgreSQL
Victor Yegorov
1. аналитика на 4MB? у вас временные файлы пишутся?

2. да, я бы сбросил, сделал руками один чекпойнт и смотрел бы таким запросом (в нём нет проверки деления на ноль, поэтому нужен чекпойнт, запускать в psql ) :

SELECT round(100.0*checkpoints_req/checkpoints,1)                                                  "Forced checkpoint ratio (%)",
      round(min_since_reset/checkpoints,2)                                                        "Minutes between checkpoints",
      round(checkpoint_write_time::numeric/(checkpoints*1000),2)                                  "Average write time per checkpoint (s)",
      round(checkpoint_sync_time::numeric/(checkpoints*1000),2)                                   "Average sync time per checkpoint (s)",
      round(total_buffers/128.0,1)                                                                "Total MB written",
      round(buffers_checkpoint/(128.0*checkpoints),2)                                             "MB per checkpoint",
      round(buffers_checkpoint/(128.0*min_since_reset*60),2)                                      "Checkpoint MBps",
      round(buffers_clean/(128.0*min_since_reset*60),2)                                           "`bgwriter` MBps",
      round(buffers_backend/(128.0*min_since_reset*60),2)                                         "Backend MBps",
      round(total_buffers/(128.0*min_since_reset*60),4)                                           "Total MBps",
      round(100.0*buffers_checkpoint/total_buffers,1)                                             "Clean by checkpoints (%)",
      round(100.0*buffers_clean/total_buffers,1)                                                  "Clean by `bgwriter` (%)",
      round(100.0*buffers_backend/total_buffers,1)                                                "Clean by backends (%)",
      round(100.0*maxwritten_clean/(min_since_reset*60000/bgwriter_delay),2)                      "`bgwriter` halt-only length (buffers)",
      coalesce(round(100.0*maxwritten_clean/(nullif(buffers_clean,0)/bgwriter_lru_maxpages),2),0) "`bgwriter` halt ratio (%)",
      round(1.0*buffers_alloc/total_buffers,3)                                                    "New buffer allocation ratio",
      min_since_reset                                                                             "Minutes since reset",
      now()-pg_postmaster_start_time()                                                            "Uptime",
      '-------'                                                                                   "-------------------------------------",
      *
 FROM (
   SELECT checkpoints_timed,
          checkpoints_req,
          checkpoints_timed + checkpoints_req checkpoints,
          checkpoint_sync_time,
          checkpoint_write_time,
          buffers_checkpoint,
          buffers_clean,
          maxwritten_clean,
          buffers_backend,
          buffers_backend_fsync,
          buffers_alloc,
          buffers_checkpoint + buffers_clean + buffers_backend total_buffers,
          pg_postmaster_start_time() startup,
          stats_reset,
          round(extract('epoch' from now() - stats_reset)/60)::numeric min_since_reset,
          delay.setting::numeric bgwriter_delay,
          lru.setting::numeric bgwriter_lru_maxpages,
          ratio.setting::numeric bgwriter_lru_multiplier,
          ckpt_s.setting::numeric max_wal_size,
          ckpt_t.setting::numeric checkpoint_timeout
     FROM pg_stat_bgwriter
     JOIN pg_settings lru   ON lru.name = 'bgwriter_lru_maxpages'
     JOIN pg_settings delay ON delay.name = 'bgwriter_delay'
     JOIN pg_settings ratio ON ratio.name = 'bgwriter_lru_multiplier'
     JOIN pg_settings ckpt_s ON ckpt_s.name = 'max_wal_size'
     JOIN pg_settings ckpt_t ON ckpt_t.name = 'checkpoint_timeout'
       ) bgstats\gx
кстати спасибо за запрос...тоже очень пригодился)
источник

A

Andrey in pgsql – PostgreSQL
После изменения pg_hba.conf
Эта команда корректная будет для перезапуска pgsql?
systemctl restart postgresql.service
источник

YS

Yaroslav Schekin in pgsql – PostgreSQL
Igor Chizhov
1. work_mem стоит дефолтное (4Мб), ограничение в 1000 сессий, в реале ожидаю не более 300-400 одновременно. PgBouncer в режиме Transaction, на вид отрабатывает нормально. Т.е. 36 + 4 Гб в текущем раскладе.
2. Вот чтения с диска у меня вообще практически нет. Чекпойнты не смотрел. Сейчас посмотрел SELECT * FROM pg_stat_bgwriter, но там статистика с декабря 2020. Я так думаю, что нужно её сбросить и посмотреть на текущую картину?
> work_mem стоит дефолтное (4Мб),

"Типичные" запросы можно посмотреть — может, каждый использует по 20*work_mem. ;)

> ограничение в 1000 сессий, в реале ожидаю не более 300-400 одновременно.

Это слишком много, почти наверняка. В норме это PgBouncer должен решать. Вы (с помощью мониторинга) выясните, сколько бывает реально одновременных подключений (пик). И примерно так и ставьте (с небольшим запасом).
источник

IC

Igor Chizhov in pgsql – PostgreSQL
Victor Yegorov
1. аналитика на 4MB? у вас временные файлы пишутся?

2. да, я бы сбросил, сделал руками один чекпойнт и смотрел бы таким запросом (в нём нет проверки деления на ноль, поэтому нужен чекпойнт, запускать в psql ) :

SELECT round(100.0*checkpoints_req/checkpoints,1)                                                  "Forced checkpoint ratio (%)",
      round(min_since_reset/checkpoints,2)                                                        "Minutes between checkpoints",
      round(checkpoint_write_time::numeric/(checkpoints*1000),2)                                  "Average write time per checkpoint (s)",
      round(checkpoint_sync_time::numeric/(checkpoints*1000),2)                                   "Average sync time per checkpoint (s)",
      round(total_buffers/128.0,1)                                                                "Total MB written",
      round(buffers_checkpoint/(128.0*checkpoints),2)                                             "MB per checkpoint",
      round(buffers_checkpoint/(128.0*min_since_reset*60),2)                                      "Checkpoint MBps",
      round(buffers_clean/(128.0*min_since_reset*60),2)                                           "`bgwriter` MBps",
      round(buffers_backend/(128.0*min_since_reset*60),2)                                         "Backend MBps",
      round(total_buffers/(128.0*min_since_reset*60),4)                                           "Total MBps",
      round(100.0*buffers_checkpoint/total_buffers,1)                                             "Clean by checkpoints (%)",
      round(100.0*buffers_clean/total_buffers,1)                                                  "Clean by `bgwriter` (%)",
      round(100.0*buffers_backend/total_buffers,1)                                                "Clean by backends (%)",
      round(100.0*maxwritten_clean/(min_since_reset*60000/bgwriter_delay),2)                      "`bgwriter` halt-only length (buffers)",
      coalesce(round(100.0*maxwritten_clean/(nullif(buffers_clean,0)/bgwriter_lru_maxpages),2),0) "`bgwriter` halt ratio (%)",
      round(1.0*buffers_alloc/total_buffers,3)                                                    "New buffer allocation ratio",
      min_since_reset                                                                             "Minutes since reset",
      now()-pg_postmaster_start_time()                                                            "Uptime",
      '-------'                                                                                   "-------------------------------------",
      *
 FROM (
   SELECT checkpoints_timed,
          checkpoints_req,
          checkpoints_timed + checkpoints_req checkpoints,
          checkpoint_sync_time,
          checkpoint_write_time,
          buffers_checkpoint,
          buffers_clean,
          maxwritten_clean,
          buffers_backend,
          buffers_backend_fsync,
          buffers_alloc,
          buffers_checkpoint + buffers_clean + buffers_backend total_buffers,
          pg_postmaster_start_time() startup,
          stats_reset,
          round(extract('epoch' from now() - stats_reset)/60)::numeric min_since_reset,
          delay.setting::numeric bgwriter_delay,
          lru.setting::numeric bgwriter_lru_maxpages,
          ratio.setting::numeric bgwriter_lru_multiplier,
          ckpt_s.setting::numeric max_wal_size,
          ckpt_t.setting::numeric checkpoint_timeout
     FROM pg_stat_bgwriter
     JOIN pg_settings lru   ON lru.name = 'bgwriter_lru_maxpages'
     JOIN pg_settings delay ON delay.name = 'bgwriter_delay'
     JOIN pg_settings ratio ON ratio.name = 'bgwriter_lru_multiplier'
     JOIN pg_settings ckpt_s ON ckpt_s.name = 'max_wal_size'
     JOIN pg_settings ckpt_t ON ckpt_t.name = 'checkpoint_timeout'
       ) bgstats\gx
1. Если честно, не знаю насчет временных файлов. Во-первых, я в администрировании PG скорее новичок, во-вторых, я не знаю, как это посмотреть в Яндекс.Облаке. Могу только предположить исходя из документации, что with hold курсоры во временные файлы пишутся.
2. Спасибо за скрипт, посмотрю.
источник

IC

Igor Chizhov in pgsql – PostgreSQL
Yaroslav Schekin
> work_mem стоит дефолтное (4Мб),

"Типичные" запросы можно посмотреть — может, каждый использует по 20*work_mem. ;)

> ограничение в 1000 сессий, в реале ожидаю не более 300-400 одновременно.

Это слишком много, почти наверняка. В норме это PgBouncer должен решать. Вы (с помощью мониторинга) выясните, сколько бывает реально одновременных подключений (пик). И примерно так и ставьте (с небольшим запасом).
Сорри за нубский вопрос, как посмотреть использование work_mem?  Explain analyze? )
По сессиям - в облаке автоматом стоит 1200 сессий на всё для этой конфигурации хоста, больше нельзя. Приложению оставил 1000.
источник

YS

Yaroslav Schekin in pgsql – PostgreSQL
Igor Chizhov
1. Если честно, не знаю насчет временных файлов. Во-первых, я в администрировании PG скорее новичок, во-вторых, я не знаю, как это посмотреть в Яндекс.Облаке. Могу только предположить исходя из документации, что with hold курсоры во временные файлы пишутся.
2. Спасибо за скрипт, посмотрю.
> исходя из документации, что with hold курсоры во временные файлы пишутся.

Хмм... разве там такое написано? Хотя, если результаты большие, то пишутся.

> Explain analyze? )

Да.

> По сессиям - в облаке автоматом стоит 1200 сессий на всё для этой конфигурации хоста, больше нельзя.

А я пишу, что нужно меньше. Если речь о max_connections.
источник

IC

Igor Chizhov in pgsql – PostgreSQL
Yaroslav Schekin
> исходя из документации, что with hold курсоры во временные файлы пишутся.

Хмм... разве там такое написано? Хотя, если результаты большие, то пишутся.

> Explain analyze? )

Да.

> По сессиям - в облаке автоматом стоит 1200 сессий на всё для этой конфигурации хоста, больше нельзя.

А я пишу, что нужно меньше. Если речь о max_connections.
> Хмм... разве там такое написано? Хотя, если результаты большие, то пишутся.

Да, я неправ, от количества информации всё смешалось в голове )
https://stackoverflow.com/questions/33635405/postgres-cursor-with-hold

> Explain analyze
Для курсора не показывает ничего связанного с памятью.
Без курсора один из самых долгих запросов:
             Sort Method: quicksort  Memory: 25kB
             Worker 0:  Sort Method: quicksort  Memory: 25kB
             Worker 1:  Sort Method: quicksort  Memory: 25kB

Выглядит смешно )

> А я пишу, что нужно меньше. Если речь о max_connections.
Я понимаю. Из-за этого меньше я ушел с GreenPlum. И мне не скажут спасибо, если опять у кого-то вылезет ошибка с одновременными подключениями. Скорее согласятся потормозить )

Реальная картина будет после публикации приложения, когда 100+ пользователей ломанутся в базу. Пока пытаюсь подготовиться, куда бежать в случае чего )))
источник

YS

Yaroslav Schekin in pgsql – PostgreSQL
Igor Chizhov
> Хмм... разве там такое написано? Хотя, если результаты большие, то пишутся.

Да, я неправ, от количества информации всё смешалось в голове )
https://stackoverflow.com/questions/33635405/postgres-cursor-with-hold

> Explain analyze
Для курсора не показывает ничего связанного с памятью.
Без курсора один из самых долгих запросов:
             Sort Method: quicksort  Memory: 25kB
             Worker 0:  Sort Method: quicksort  Memory: 25kB
             Worker 1:  Sort Method: quicksort  Memory: 25kB

Выглядит смешно )

> А я пишу, что нужно меньше. Если речь о max_connections.
Я понимаю. Из-за этого меньше я ушел с GreenPlum. И мне не скажут спасибо, если опять у кого-то вылезет ошибка с одновременными подключениями. Скорее согласятся потормозить )

Реальная картина будет после публикации приложения, когда 100+ пользователей ломанутся в базу. Пока пытаюсь подготовиться, куда бежать в случае чего )))
> Без курсора один из самых долгих запросов:

Так это не обязательно долгие. Нужно, как раз, "типичные" смотреть.
источник

IZ

Igor Zinovik in pgsql – PostgreSQL
Victor Yegorov
13.2 выйдет 11 февраля, на неё и переходить
У питоносообщества нет пока что стабильной версии psycopg которая умеет работать с PostgreSQL 13.
Надо будет следить за ситуацией.
источник

IC

Igor Chizhov in pgsql – PostgreSQL
Yaroslav Schekin
> Без курсора один из самых долгих запросов:

Так это не обязательно долгие. Нужно, как раз, "типичные" смотреть.
Их полторы сотни :( И все типичные :) И это без всевозможных фильтров.
источник

R

Roman in pgsql – PostgreSQL
Добрый день, подскажите как сделать, чтобы если поле пустое, то пустое и вернуть, а если нет, то выполнить concat. Пробовал так через case, но что-то возникли проблемы
источник

SS

Sergii Serogin in pgsql – PostgreSQL
Coalesce?
источник

AB

Alexey Bulgakov in pgsql – PostgreSQL
наоборот же
источник

IC

Igor Chizhov in pgsql – PostgreSQL
Roman
Добрый день, подскажите как сделать, чтобы если поле пустое, то пустое и вернуть, а если нет, то выполнить concat. Пробовал так через case, но что-то возникли проблемы
код покажи
источник