• Почему в crosstab нужно указывать VALUES в запросе на выборку?

    Melkij
    @Melkij
    PostgreSQL DBA
    https://www.postgresql.org/docs/current/tablefunc....
    The main limitation of the single-parameter form of crosstab is that it treats all values in a group alike, inserting each value into the first available column. If you want the value columns to correspond to specific categories of data, and some groups might not have data for some of the categories, that doesn't work well. The two-parameter form of crosstab handles this case by providing an explicit list of the categories corresponding to the output columns.

    crosstab(text, text) вариант не требует именно values. Второй аргумент функции может быть любым запросом, который сгенерирует полный список категорий. Этот вариант crosstab нужен, если первый запрос может возвращать данные не для всех категорий.

    С точки зрения синтаксиса, insert .. values - это то же самое, что insert .. select, а values - это частный случай select только списка констант
    melkij=> VALUES ('кофты'), ('ботинки'), ('пальто');
    column1
    ---------
    кофты
    ботинки
    пальто
    (3 строки)

    это самодостаточный запрос. Можно записать как select 'кофты' union all select 'ботинки' union all select 'пальто', но зачем?
    Ответ написан
    1 комментарий
  • Как установить оперативную память с пониженным напряжением, чтобы она не сгорела при первом пуске?

    Melkij
    @Melkij
    PostgreSQL DBA
    Если у этого набора нестандартное напряжение 1,25В - то оно не пониженное, а повышенное. DDR5 использует 1.1V

    Варианта два: или договорятся с материнкой на использовании XMP профиля в нестандартном режиме разгона либо согласуют стандартный SPD профиль (соответственно на стандартном для DDR5 напряжении), а дальнейшие настройки вручную.
    Ответ написан
    1 комментарий
  • Почему пропадает вывод таблицы в терминале psql?

    Melkij
    @Melkij
    PostgreSQL DBA
    По-умолчанию, psql делегирует вывод размером больше вашей консоли в утилиту пагинации, сконфигурированную в вашей системе. Например, more или less. Дальнейшее поведение соответственно на усмотрение этой программы.
    \pset pager off выключает pager
    Ответ написан
    1 комментарий
  • Какой будет более правильный вариант при секционировании таблиц?

    Melkij
    @Melkij
    PostgreSQL DBA
    Можно объявить PK индивидуально на каждой партиции. Глобально-уникального индекса всё равно нет.
    Составной PK включающий ключ партицирования логичным образом изменит своё поведение.

    PS: в чём вы предполагаете смысл от BY HASH ("created_at")?
    PPS: под пользователями понимаются не люди? Просто людей на Земле маловато чтобы имело смысл делать партицирование по пользователям.
    Ответ написан
  • Возможно ли установить какую либо ос на TL-R470T+?

    Melkij
    @Melkij
    PostgreSQL DBA
    для современных openwrt мало флеша и ram https://openwrt.org/supported_devices/864_warning
    флешка "64M-bit" = 64Mb, то есть 8MB, а не 64MB

    в целом этот роутер судя по всему изначально на openwrt и работает: https://forum.openwrt.org/t/tp-link-tl-r470t-using... Только, как это водится у проприетарщины, подвергнут вандализму.
    начать можете отсюда: https://forum.archive.openwrt.org/viewtopic.php?id...
    Ответ написан
    Комментировать
  • Как исправить несоответствие версии сортировки?

    Melkij
    @Melkij
    PostgreSQL DBA
    Специальный варнинг, очень явно подсказывающий, что держать физическую репликацию на разных ОС - идея плохая. Причина в время от времени происходящих изменении правил сортировки строк: https://wiki.postgresql.org/wiki/Locale_data_changes
    СУБД это задевает в части индексов, если на мастере было '1-1' < '11', то запись запишется в одно место btree, а если на реплике оператор сравнения говорит что '1-1' > '11', то выполнение запроса смотрит в логичное для этого результата место индекса и вообще не находит данные. Потому что мастер их записал располагая другим ответом функции сравнения строк.
    Так и проявляется IRL, поиск по индексу говорит что данных нет, но если форсировать seqscan - то данные находятся.

    Варнинг на мой взгляд действительно избыточно говорливый, сыпется при каждом подключении к базе, но какой есть. Обновляйте ОС, в общем, на одинаковую в рамках всего кластера. Затем перестраивайте пострадавшие индексы.
    Ответ написан
    Комментировать
  • Должен ли тип данных внешнего ключа совпадать с типом данных первичного ключа?

    Melkij
    @Melkij
    PostgreSQL DBA
    serial - это и есть integer, а типа данных serial вообще не существует. Это просто синтаксический сахар вокруг неявного создания sequence из времён, когда GENERATED ALWAYS AS IDENTITY не было ни в стандарте ни в postgresql.

    Обратно к вопросу: тип данных может не совпадать. Но обычно это ошибка схемы данных, нежели запланированное различие.
    Ответ написан
    Комментировать
  • На какие нагрузки рассчитан диск NAS версии?

    Melkij
    @Melkij
    PostgreSQL DBA
    Расходник же.

    Укладывается в требуемое от него время работы? Значит хорошо. (например, я не уверен, что SMR диски будут успевать писать 8тб в сутки)
    Помер на гарантии - поменяете. У HDD в гарантии пока нет ограничения на TBW. Помер после гарантии - что ж, покупаете новый.
    Ответ написан
    Комментировать
  • Купил себе новый жёсткий диск, когда начинаю с ним работать, он вообще исчезает и не распознаётся системой, что делать?

    Melkij
    @Melkij
    PostgreSQL DBA
    Уточняете у продавца процедуру работы и местоположение отдела рекламаций. Сдаёте по гарантии.
    Ответ написан
    3 комментария
  • Как понять к какой БД относиться таблица из pg_stat_io?

    Melkij
    @Melkij
    PostgreSQL DBA
    Это всегда current_database()
    У каждой БД свой собственный системный каталог со своим собственным pg_class, pg_namespace и так далее (за исключением буквально пары действительно глобальных вроде pg_database и pg_authid).
    Ответ написан
    1 комментарий
  • Как настроить prepared statement в pgbouncer?

    Melkij
    @Melkij
    PostgreSQL DBA
    PHP PDO несовместим с max_prepared_statements фичей баунсера.

    PDO отправляет deallocate как SQL запрос, а не как команду протокола.
    Ответ написан
  • Как можно получить изменения во VIEW, когда изменяется базовая таблица?

    Melkij
    @Melkij
    PostgreSQL DBA
    view не хранит никаких данных. Это просто сохранённое дерево запроса, встраиваемое в обратившийся к этой view запрос.
    Вам нужен триггер на таблице с данными, который будет писать в отдельную аудит таблицу историю изменений. Потом из этой таблицы получайте историю.
    Ответ написан
    Комментировать
  • Как настроить второй канал интернета?

    Melkij
    @Melkij
    PostgreSQL DBA
    Через route Multihoming не делается. Фундаментально это известно как LARTC - linux advanced routing & traffic control.

    Если железка используется только под роутер, то поставьте на неё openwrt и воспользуйтесь пакетом mwan3. Весьма приятная обвязка, корректно реализующая multihoming. Это будет очень сильно проще и надёжнее.
    Ответ написан
  • Как партиционировать большую таблицу в PG 11?

    Melkij
    @Melkij
    PostgreSQL DBA
    если clock это unixtime, а так же именно по нему и хотим партиционировать в дальнейшем:

    begin;
    set local statement_timeout to '100ms';
    alter table history add constraint partition_key check (clock < :N) not valid;
    commit;
    alter table history validate constraint partition_key;
    begin;
    set local statement_timeout to '100ms';
    alter table history rename to history_old_data;
    create table history (...) partition by range (clock);
    alter table history attach partition history_old_data for values from (minvalue) to (:N);
    create table history_part_... partition of history for values from (:N) to (...);
    commit;


    :N - некая дата в будущем, до неё данные будут писаться в старую 5тб табличку, после - в новую партицию. Если до выбранного :N не успеете завершить миграцию - то удалить check constraint, иначе запись, конечно, встанет.
    Ответ написан
    2 комментария
  • Как уменьшить время выполнения запроса like '%uri%' в Postgresql?

    Melkij
    @Melkij
    PostgreSQL DBA
    create extension pg_trgm;
    create index concurrently db_url_trgm_idx on db1 using gin ("Url" gin_trgm_ops);

    https://www.postgresql.org/docs/current/pgtrgm.html
    Ответ написан
    Комментировать
  • Объясните за LIMIT - правильно ли работает?

    Melkij
    @Melkij
    PostgreSQL DBA
    limit штука простая. LIMIT [offset,] row_count означает, что запросу нужно прочитать offset + row_count строк из результата запроса, затем отбросить первые offset найденных строк и вернуть то что осталось. Вот и вся логика. Если после откидывания offset строк в результате не осталось - будет возвращено пустое множество.
    Ответ написан
    Комментировать
  • Как задать дефолтные права на все таблицы в схеме в postgres?

    Melkij
    @Melkij
    PostgreSQL DBA
    Необходим свой комплект ALTER DEFAULT PRIVILEGES для каждого пользователя, который будет создавать объекты в базе.
    Это раз.

    Два - идея вообще стабильно работать будет только для CRUD. Всякие alter table требуют быть владельцем таблицы либо быть в группе владельца (не в общей с владельцем группе, а именно чтобы владелец таблицы был в группе пользователя).

    Подумайте над организацией процессов. Наименее проблемно будет, если у вас будет только один пользователь, который создаёт или меняет схему данных, а ro (select только) и rw (select/insert/update/delete) пользователей может быть много. Всё остальное к приключениям.
    Ответ написан
    Комментировать
  • Как транспонировать строки в столбцы?

    Melkij
    @Melkij
    PostgreSQL DBA
    проще на клиенте форматировать. Но поскольку число столбов в этой задаче можно считать константой, то можно и захардкодить
    select EXTRACT(YEAR FROM time) AS year,
    sum(cost) filter(where EXTRACT('month' FROM time) = 1) as jan,
    sum(cost) filter(where EXTRACT('month' FROM time) = 2) as feb,
    ...
    sum(cost) filter(where EXTRACT('month' FROM time) = 12) as dec
    from tablename
    where ...
    group by 1
    order by 1
    Ответ написан
    Комментировать
  • Оптимизируется ли UPDATE, если значения полей на самом деле не меняются?

    Melkij
    @Melkij
    PostgreSQL DBA
    В postgresql создаётся физически новая версия строки при update (с обновлением всех индексов либо hot update если применимо) даже если ни одно поле не меняет своё действительное значение. Есть встроенный триггер suppress_redundant_updates_trigger, который можно повесить на таблицу, тогда ничего действительно не меняющий в данных update будет пропускаться.

    Если меняется хотя бы одно значение - оптимизации не подлежит, должна быть записана новая версия строки в таблицу (чтобы MVCC обеспечить). Если возможно, оптимизация HOT update исключит сопутствующее обновление индексов.
    Ответ написан
    9 комментариев
  • Каким образом определяют наиболее старую версию python для работоспособности кода?

    Melkij
    @Melkij
    PostgreSQL DBA
    - у тебя какой версии X?
    - Y
    - ага, а у меня Z. Значит напишем "не тестировалось с X версии ниже Y"


    Спустя время
    - давай поднимем минимальную версию до Z, смотря какая там фича полезная нам была бы
    - хм, вышел он N времени назад, проблемой оказаться не должно, не возражаю, добавь только в доку "требуется X версии минимум Z"


    Так оно и происходит обычно.
    Ответ написан
    Комментировать