Category: it

Category was added automatically. Read all entries about "it".

Быстрый рассчёт count(*) в PostgreSQL

Т.к. PostgreSQL использует модель базы MVCC (по сути каждая сессия/транзакция имеет собственную «копию» базы) — поэтому число записей в таблицах нигде не хранится.

На больших таблицах count(*) обходит все записи, что может быть очень долго.

Число строк в таблице можно быстро, но не точно вычислить запросом

SELECT

  (reltuples/relpages) * (

    pg_relation_size('ИМЯ_ТАБЛИЦЫ') /

    (current_setting('block_size')::integer)

  )

  FROM pg_class where relname = 'ИМЯ_ТАБЛИЦЫ';


И ещё более быстрый, но ещё менее точный вариант получения оценки числа строк:

SELECT reltuples FROM pg_class where relname = 'ИМЯ_ТАБЛИЦЫ';


Полезности PostgreSQL

Как найти различия в данных между двумя идентичными по структуре таблицами

SELECT table1.*  FROM table1 LEFT JOIN table2  ON table1 = table2
WHERE  table2 Is NULL;

Как получить список значений в виде одной строки через запятую

Синтетический пример, возвращающий список идентификаторов записей со статусом=5 и созданных 31.12.2019. На выходе будет строка примерного вида «69, 1998, 1, 288, 287, 33, 404040» (идентификаторы не упорядочены)

SELECT array_to_string( array(
   SELECT t.id FROM table AS t
   WHERE date(t.created_at)='2019-12-31' AND t.status_id=5
), ', ');


Huge Pages для PostgreSQL

Размер Huge Pages = shared_buffers + 2-3%

(хотя в руководстве рекомендуется исходить из пиковой величины виртуальной памяти основного процесса (PID которого лежит в postmaster.pid))

На заметку - по Failover PostgreSQL

* corosync/pacemaker (есть жалоба - на pacemaker’e регулярно возникает ситуация 2 мастера при сплите сети, т.е. один мастер не вырубается)

* patroni ( https://habrahabr.ru/post/322036/ ) + самопальный скрипт на чём-нибудь к pgbouncer который смотрит кто текущий лидер у patroni переписывает pgbouncer.ini и делает SIGHUP для pgbouncer (Можно вместо своего скрипта взять confd - https://github.com/kelseyhightower/confd Он умеет генерировать конфиги по шаблону на основе содержимого DCS (etcd, consul или zookeeper))

* в 10ке смотреть сюда https://wiki.postgresql.org/wiki/New_in_postgres_10#Connection_Failover_and_Routing_in_libpq

* stolon — https://eax.me/stolon/


Настройка пулов в pgbouncer

Для ограничения размера пула следует использовать опцию max_db_connections равной pool_size. Без её применения у каждого пользователя пула будет свой pool_size. 

Данное поведение не документировано, но max_db_connections работает именно так: ограничивает число активных транзакций для всех пользователей пула.

Пример пула pgbouncer:

my_database = host=localhost pool_size=5 max_db_connections=5

Баг репликации в PostgreSQL 9.4

Дано:
PostgreSQL 9.4.9 реплицированный Master-Slave.
На таблице, в которую активно пишут на мастере и из которой столь же активно читают на слейве сделать:
* drop index, а потом
* create index без модификатора concurrently

Результат:
hot_standby-слейвы зависают в недоумении.
Валятся ошибки вида:
ERROR: canceling statement due to conflict with recovery
DETAIL: User was holding a relation lock for too long.


Временное решение: как-то временно остановить поток операций записи в мастер (например, тупо положить сервер приложения) и ждать, пока слейвы не догонят мастера. Криво-косо, но...

Что такое "провиженинг" (provisioning eng.)

Я большой не любитель использования иностранных слов там, где можно сказать по-русски.
Однако, вот с этим понятием в "облачной" среде информационных технологий, закавыка.
Неоднозначная закавыка, как с самой сущность, которую обычно называют "провиженинг", так и с попыткой назвать эту сущность по-русски.
В английском языке provisioning - это обеспечение кого-либо продовольствием (провизией :) ), снабжение.
Потом это слово попало к технарям, и понеслось...
Collapse )

Гипервизоры и 1С. Почему много ядер для 1Сной ВМ не помогает

1Сники в душе не умеют в гипервизоры, поэтому требуют как можно больше ядер в ВМ, ведь "производительности мало".
Ну и рекламные спеки на сервера они умеют читать - там 24/48 ядер, все дела.

Collapse )

Для чего не очень подходит PostgreSQL

1) для аналитики (но есть CitusDB, Greenplum)
2) для стриминговых данных (но есть PipelineDB)
3) для вычислений на GPU (но есть PGStrom)


Про CitusDB:
http://www.pcweek.ru/infrastructure/article/detail.php?ID=184357
https://pgconf.ru/media/2016/02/19/7%20MARCO%20SLOT.pdf

Про Greenplum:
http://russoftcom.ru/solutions/upravlenie-biznes-protsessami/analiticheskie-sistemy-greenplum/
https://habrahabr.ru/search/?q=%5Bgreenplum%5D&target_type=posts

Про PipelineDB:
"основан на кодовой базе PostgreSQL 9.4 и полностью совместим с данной СУБД. Код проекта распространяется через GitHub. Из дополнительных возможностей PipelineDB отмечается поддержка выполнения непрерывных SQL-запросов, вероятностные структуры данных, возможность слияния непрерывно наполняемых таблиц.
Основным элементом для непрерывной обработки данных выступает специальный тип представлений - CONTINUOUS VIEW, отличающийся от обычных представлений возможностью использования потоков в качестве источника данных для SELECT-запросов. По мере поступления новых данных в потоке, выдаваемый представлением вывод непрерывно обновляется. В качестве примеров областей применения непрерывных запросов можно отметить отслеживание в реальном времени активности в логах и оценка выполнения периодического опроса датчиков.
"