Задать вопрос
  • С чего начинать тестирование двухюнитовых серверов с 16 планками U-DIMM и 24 хардами в Linux?

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

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

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

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

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

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

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

    Melkij
    @Melkij
    DBA для вашего PostgreSQL?
    Напрямую запросом, без лишнего 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
    DBA для вашего PostgreSQL?
    Это так называемый fake raid. Удивительная поделка, объединяющая недостатки одновременно аппаратного и программного рейда, но не обладающая никакими из их достоинств.
    Использовать можно только если скучно и хочется приключений.

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

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

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

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

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

    Да.

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

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

    Melkij
    @Melkij
    DBA для вашего PostgreSQL?
    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
    DBA для вашего PostgreSQL?
    Для начала, в 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
    DBA для вашего PostgreSQL?
    Не нравитсо именно это

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

    Invalid default value for 'post_date'

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

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

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

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

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

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

    Melkij
    @Melkij
    DBA для вашего PostgreSQL?
    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).
    Ответ написан
  • Какую базу и способ хранения выбрать?

    Melkij
    @Melkij
    DBA для вашего PostgreSQL?
    База на 30гб? Какая смешная кроха.

    Да сгенерируйте себе синтетических данных и поиграйтесь с ними. Я понимаю неудобно на локальной машине щупать базу в десяток террабайт - но лишь только 30гб не проблема просто сгенерировать и посмотреть вживую.
    Ответ написан
    1 комментарий
  • Что происходит при повторном запуске команды MySQL source?

    Melkij
    @Melkij
    DBA для вашего PostgreSQL?
    source читает указанный файл с начала и до конца, передаёт серверу как будто это SQL команды. Никакой дополнительной логики не предполагается.
    https://dev.mysql.com/doc/refman/8.0/en/mysql-batc...

    Эквивалент "mysql db_name < text_file"
    Ответ написан
  • Как избавиться от ошибки с prepared statement при работе с PostgreSQL через PgBouncer?

    Melkij
    @Melkij
    DBA для вашего PostgreSQL?
    Есть ощущение, что PgBouncer подготавливает выражение для ускорения работы при первом запуске, но после остановки выполнения где-то на середине и последующего запуска, PgBouncer все еще считает, что выражение должно остаться на сервере, а вот сервер уже так не думает.

    Замените слово "PgBouncer" на "ваше приложение" и тогда получите относительно верное описание происходящего.

    С практически 100% вероятностью у вас pgbouncer сконфигурирован в режиме transaction pool mode. А выполнение любого нового запроса в extended protocol (prepared statement) состоит из трёх вызовов:
    - prepare
    - bind
    - execute
    Нет ничего ошибочного в том, что pgbouncer сконфигурированный в режиме пула транзакций может направить каждое из этих 3 сообщений в разные коннекты базы. Это прямым текстом задокументированное ограничение пула транзакций. Итог закономерный, соответствующие процессы базы не понимают о чём речь и выражают удивление такими ошибками.

    Отключите использование server-side prepared statements на приложении.
    Ответ написан
    2 комментария