• Как правильно составить запрос INSERT в postgresql?

    Melkij
    @Melkij
    PostgreSQL DBA
    ... DO UPDATE SET payment_date = info.payment_date + interval '23 hours';

    Данные конфликтующей строки доступны
    The SET and WHERE clauses in ON CONFLICT DO UPDATE have access to the existing row using the table's name (or an alias), and to rows proposed for insertion using the special excluded table.

    имени таблицы (или алиаса указанного в запросе) - та версия строки что есть
    псевдоним excluded - те значения что этот insert предполагал записать
    Ответ написан
    2 комментария
  • Правильно ли организовано логирование?

    Melkij
    @Melkij
    PostgreSQL DBA
    Документация отвечает однозначно
    Current date and time (start of current transaction);

    current_timestamp - это всегда время начала транзакции. Сколько бы транзакция ни заняла времени, до её окончания current_timestamp будет возвращать одно и то же значение.
    А правильно это для вашей задачи или нужно использовать другую из функций датывремени - это только к вам вопрос.
    Ответ написан
    1 комментарий
  • Как ускорить работу слота репликации на PostgreSQL?

    Melkij
    @Melkij
    PostgreSQL DBA
    Скорей всего упираетесь в производительность IO на временных файлах, увеличение logical_decoding_work_mem с этим должно помочь.
    Затем посмотрите, не упираетесь ли в 100% cpu на этом процессе. logical decoding однопоточный, ему важна производительность в один поток. Тут ничего не поможет. Прочитать, понять и переупорядочить данные среди гигабайтов wal'ов всё равно придётся.
    Ответ написан
    Комментировать
  • С чего начинать тестирование двухюнитовых серверов с 16 планками U-DIMM и 24 хардами в Linux?

    Melkij
    @Melkij
    PostgreSQL DBA
    CPU(s):                          256
    On-line CPU(s) list:             0-255
    Thread(s) per core:              2
    Core(s) per socket:              64
    Socket(s):                       2

    Я не понял проблематику ситуации. 40 ядер, несколько сотен гигов RAM да пара десятков дисков - средняя железка, какие там у вас специфические проблемы такие? 40 ядер нынче не проблема даже одним сокетом получить.

    Что касается памяти тут отдельная история, поступила жалоба, что U-DIMMы работают только при полной сборке (все 16), либо подключенные последовательно (с1 по 4 место например), но подключая в 1,3,7,12(например) места некоторые планки не определяются, либо сервер работает не корректно (не запускается, не стартует).

    См. документацию к материнке. Там будет описано, в каком порядке необходимо заполнять слоты. Да, это стандартное требование JEDEC для DIMM'ов, что серверных, что десктопных. Технически связано с терминаторами. Затем, после требований стандарта, идёт логика как не повесить всю имеющуюся память на один и тот же канал памяти одного и того же CPU. NUMA всё-таки.
    Вы правда занимаетесь серверами?
    Ответ написан
  • Почему я могу установить NULL в колонку mark, если у меня есть CHECK(mark in (1,2,3))?

    Melkij
    @Melkij
    PostgreSQL DBA
    Нет, не должен. Значение NULL не противоречит такому check constraint. На самом деле даже в исходниках самого postgresql есть замечания, что такое поведение несколько неожиданно, но таков стандарт SQL.
    Ответ написан
    Комментировать
  • Что лучше, 2 ядра 4 Гц или 8 ядер 1.6 Гц (цифры рандом)?

    Melkij
    @Melkij
    PostgreSQL DBA
    То что в прикладной вашей задаче будет давать лучше результат.

    Когда-то давно, когда в десктопах были преимущество одноядерные CPU, маркетинг любил называть частоты. Потом полюбил козырять числом ядер. Потом ещё чем-нибудь. Одна характеристика чтобы доказать собственное превосходство над конкурентом (и что не менее важно - над предыдущим поколением собственной же продукции) - это же так здорово! Только нихрена это так просто не работает.

    Вот уже которое десятилетие единственный корректный ответ в выборе CPU - сравнить в конкретных условиях. Задача со звёздочкой: сравнить корректно.

    В частности, вы не указали, одной ли микроархитектуры два сравниваемых CPU. А этот маленький нюанс моментально лишает всякого смысла декларируемую частоту работы. Двухкратная разница производительности на одной частоте? Почему нет, история знает такие примеры. Потом кэши, организация памяти, а из недавнего - состояние защит от атак на спекулятивное выполнение. Ежели всё это идентично и из различий только число ядер и частота - то опять же упрёмся в необходимые задачи. Однопоточному приложению будет безразлично, есть ли ещё 7 ядер или только второе.
    Ответ написан
    Комментировать
  • Как удалить null из выборки?

    Melkij
    @Melkij
    PostgreSQL DBA
    array_agg(attr.name) filter(where ...)
    Ответ написан
    2 комментария
  • Как поменять значение max_stack_depth в postgres?

    Melkij
    @Melkij
    PostgreSQL DBA
    Сначала внимательно посмотрите на свой триггер, не пускаете ли вы его в бесконечную рекурсию. Нет, postgresql не будет вам мешать делать бесконечно-рекурсивный триггер и никак не будет препятствовать его выполнению до тех пор пока это будет возможно физически. И вот тут stack depth limit обычно и заканчивается первым.
    Ответ написан
    3 комментария
  • Как вставить аргумент функции между $$ $$ строкой в PostgreSQL?

    Melkij
    @Melkij
    PostgreSQL DBA
    Напрямую запросом, без лишнего execute
    CREATE OR REPLACE FUNCTION example(arg int)
    RETURNS int4
    LANGUAGE plpgsql
    AS $$
    declare
       out int;
       BEGIN
       --function body
       SELECT field * arg into out FROM randomtable;
       return out;
       END
       $$;
    select example(1);


    Или, если действительно нужно генерировать динамический SQL, то передать параметром в using:
    CREATE OR REPLACE FUNCTION example(arg int)
    RETURNS int4
    LANGUAGE plpgsql
    AS $$
    declare
       out int;
       somequery text;
       BEGIN
       --function body
       somequery := $q1$ SELECT field * $1 FROM randomtable $q1$;
       EXECUTE somequery into out using arg;
       return out;
       END
       $$;
    Ответ написан
    Комментировать
  • Как надёжен RAID на простой, не серверной, плате?

    Melkij
    @Melkij
    PostgreSQL DBA
    Это так называемый fake raid. Удивительная поделка, объединяющая недостатки одновременно аппаратного и программного рейда, но не обладающая никакими из их достоинств.
    Использовать можно только если скучно и хочется приключений.

    Не забудьте настроить бекапы. Рейды с избыточностью данных это про снижение простоя, а не замена бекапам.
    Ответ написан
    Комментировать
  • Увеличение LVM раздела на внешней хранилки?

    Melkij
    @Melkij
    PostgreSQL DBA
    pvresize. Затем lvresize с resize2fs или lvcreate дальнейшие или ещё чего, смотря зачем увеличивали.
    Ответ написан
    Комментировать
  • Как подключать питание процессора 8+8pin на LGA1700?

    Melkij
    @Melkij
    PostgreSQL DBA
    Единственный смысл добавления всё новых проводов от блока питания к материнской плате помимо 20-контактного коннектора ATX из 1995 года - уменьшение силы тока, протекающего по наиболее загруженным проводам и контактам разъёмов.

    Как простое следствие этого - нет никакого физического смысла в использовании разветвителя. Это никак не уменьшит силу тока, протекающего по кабелю от блока питания. Позволит обмануть плату, если она требует чтобы оба коннектора были подключены, но это именно обман, а должны быть раздельные комплекты проводов от блока питания.
    Ответ написан
    Комментировать
  • Соблюдается ли очередь данных при нескольких bulk-insert операциях?

    Melkij
    @Melkij
    PostgreSQL DBA
    Могут ли их primary key id смешиватЬся?
    То есть, если запросить дату с ORDER BY id, и получить

    Да.

    За генерацию значений отвечают sequence (неважно каким именно способом объявлена таблица - default nextval явно созданного сиквенса, serial или generated identity - это всё будет сиквенс).
    Сиквенс гарантирует только уникальность своих значений. Никаких гарантий порядка записи в таблицу он не даёт.

    Два параллельных insert в postgresql так же друг друга никак не блокируют и исполняются конкурентно. Кто и в каком порядке надёргал nextval сиквенса потребное для своих данных количество раз - такие значения они и запишут.
    Ответ написан
    Комментировать
  • Какой разрядности счётчики транзакций в PostgreSQL 14 версии?

    Melkij
    @Melkij
    PostgreSQL DBA
    internals 64 битные
    heap 32 битные

    Если вы хотите чтобы ни один крупный проект не стал обновляться на такую новую версию - без проблем, поменять формат страницы heap не так уж сложно. Почему после принятия такого патча никто не станет обновляться? Потому что вместе со сменой формата страницы вы напрочь сломаете in-place pg_upgrade и вынудите обновляться только через dump+restore. Удачи это сделать на 10тб базе за обычные для pg_upgrade 5-10 минут даунтайма. А если у вас крошечная база которую можно за 10 минут обновить дампом - то вам и 64-битные xid банально не нужны и не важны.
    Если интересно поподробнее, подождите запись вот этого свежего доклада
    Ответ написан
    Комментировать
  • Есть ли разница в БД Postgres: хранить string(255) или string?

    Melkij
    @Melkij
    PostgreSQL DBA
    Для начала, в postgresql нет типа данных string. (а если это самодельный тип, что postgresql сделать тоже позволяет, то смотреть надо как он реализован у вас)

    Для текстовых данных в postgresql есть:
    - text. Просто text, без специфических ограничений на содержимое
    - varchar - это всё тот же самый text. К varchar можно добавить указание ограничения максимальной длины хранимого текста в символах. Почему это отдельный тип данных? Потому что такого требование стандарта SQL
    - char - фиксированный длины (в символах! в байтах они всё равно динамической длины получатся для того же utf8). Смысла его использовать в postgresql, как вы сами процитировали документацию, нет. Зачем он нужен? Потому что описан в стандарте.

    В отличии от, например, mysql, для postgresql нет ничего особого в значении 255. Если в определении таблицы видно такое ограничение на 255 символов - обычно это означает именно "никто не обдумывал цель такого ограничения для этого поля, просто какое-то число"

    Говоря о выборе между text или varchar(N) - varchar(N) с разумным для этих данных N предпочтительнее для коротких строк, потому что не даст записать 10мб туда где должно быть, например, не более 64 символов (это не совсем шутка, случай из практики). А по ошибке в месте записи дебажить логику приложения куда как проще, чем искать потом откуда такое взялось.
    Ответ написан
    2 комментария
  • Не могу импортировать базу?

    Melkij
    @Melkij
    PostgreSQL DBA
    Не нравитсо именно это

    Никогда не думали, что само сообщение об ошибке пишут чтобы его вообще-то прочитали?

    Invalid default value for 'post_date'

    Смотрим на определение, видим DEFAULT '0000-00-00 00:00:00'
    Ну да, всё верно, такое значение некорректно, такой даты не существует. См. deprecated NO_ZERO_DATE
    Ответ написан
    1 комментарий
  • Возможно подключить через PG Admin к удаленной БД на продакшене?

    Melkij
    @Melkij
    PostgreSQL DBA
    а зачем нужен pgadmin для управления базой?

    Ну а помимо этого, pgadmin не только умеет подключаться удалённо куда ему скажут, но и самостоятельно запускать для этого ssh туннель.
    Ответ написан
    Комментировать
  • Как преобразовать значения к типу в PDO?

    Melkij
    @Melkij
    PostgreSQL DBA
    Насколько я помню: https://github.com/php/php-src/blob/PHP-8.0/ext/pd...
    Нужен mysqlnd для получения родных типов данных.
    Ответ написан
    Комментировать
  • Последовательное включение жёстких дисков, можно ли и как?

    Melkij
    @Melkij
    PostgreSQL DBA
    Power-up in standby (PUIS). Должен уметь контроллер дисков.

    Почитайте вот этот топик: https://forum.ixbt.com/topic.cgi?id=11:44797 может быть найдёте что-то для себя полезное.
    Ответ написан
    Комментировать
  • Как оптимизировать update postgresql?

    Melkij
    @Melkij
    PostgreSQL DBA
    UPDATE orders_new
    SET client_code=access.title
    FROM orders_new O

    Ну классика жанра. Если не видите self-join - то посмотрите ещё раз. Очевидно ошибочный запрос.

    https://www.postgresql.org/docs/current/sql-update.html
    Do not repeat the target table as a from_item unless you intend a self-join (in which case it must appear with an alias in the from_item).
    Ответ написан