• Как установить PostgreSQL 11.5 на Ubuntu Server?

    Melkij
    @Melkij
    PostgreSQL DBA
    Вам не нужна именно 11.5. Ставьте актуальный minor - 11.8 или в четверг это уже будет 11.9.

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

    Minor релизы postgresql содержат только исправления ошибок и безопасности. Искать давно исправленные ошибки не самое полезное что можно придумать.
    Ответ написан
    3 комментария
  • Что можно использовать в SQL-запросе?

    Melkij
    @Melkij
    PostgreSQL DBA
    Проще
    select _task, 
    count(*) filter(where _status = 'done') as done_cnt,
    count(*) filter(where _status = 'refused') as refused_cnt
    from test
    where _status in ('done', 'refused')
    group by _task;
    Ответ написан
    1 комментарий
  • Почему слишком большой размер данных после добавления данных в базу?

    Melkij
    @Melkij
    PostgreSQL DBA
    Удаляю значит старые записи в таблицах и php парсю xml файлы и вставляю в таблицы соответствующие.

    Ну и совершенно закономерно получаете двукратный рост как самой таблицы, так и всех индексов. Всё верно.
    Почему? Потому что MVCC. Удаление не удаляет данные, т.к. их может кто-то хотеть ещё прочитать из более старых транзакций, а только отмечает xmax - id транзакции, с которой записи перестают быть видимы. Место занимаемое удалёнными строками будет возможно затем переиспользовать под новые данные после прохода vacuum вручную или автовакуумом.

    Индексы, разумеется, тоже занимают место. И по той же самой причине индексы в варианте delete всей таблицы + insert будут занимать вдвое больше места.

    Когда вы хотите удалить всё из таблицы - вам нужен не delete, а truncate.
    Ответ написан
    1 комментарий
  • Как создать уникальный индекс с условием?

    Melkij
    @Melkij
    PostgreSQL DBA
    Прямо-таки буквально так и делается

    create unique index on tablename (contractor_id) where is_main;
    Ответ написан
    Комментировать
  • Как в imap_search($inbox, 'FROM"...."'), в FROM задать поиск нескольких отправителей?

    Melkij
    @Melkij
    PostgreSQL DBA
    В комментарии разобрано: https://www.php.net/manual/en/function.imap-search.php
    imap_search function is not fully compatible with IMAP4. the c-client used as of now supports only IMAP2 and some search criterion will not be available for use such as "OR"

    Никак, то есть.

    Лучше вовсе поищите какую-нибудь другую библиотеку для imap. Эта де факто дохлая. https://news-web.php.net/php.internals/107950
    Ответ написан
    Комментировать
  • Увеличение раздела Linux?

    Melkij
    @Melkij
    PostgreSQL DBA
    Раздел на диске непрерывен. У вас не может быть раздел 1, затем свап, затем продолжение раздела 1. Выключите и снесите свап, расширьте раздел. Собственно свап можно затем сделать файлом чтобы не извращаться.
    Ответ написан
  • Проблемы после переноса сервиса с одного сервера на другой (yii2)?

    Melkij
    @Melkij
    PostgreSQL DBA
    random_bytes и openssl_random_pseudo_bytes и обязаны возвращать бинарный хлам. Они принципиально делают указанное количество байт мусора, в этом и есть их предназначение.

    Аналогично у yii2 так прямым текстом и сказано в доке:
    https://www.yiiframework.com/doc/api/2.0/yii-base-...
    generateRandomKey() public method
    Generates specified number of random bytes.
    Note that output may not be ASCII.
    See also generateRandomString() if you need a string.
    Ответ написан
    2 комментария
  • Postgresql сломалась репликаци знаю причины не знаю как поченить стэндбай?

    Melkij
    @Melkij
    PostgreSQL DBA
    скопировать с мастера папку pg_wal с файлами

    Если бы нужный сегмент на primary был - его бы уже давно отдали реплике по запросу walreceiver'а. Значит его там нет.
    Если у вас на какой-то из реплик все необходимые wal всё же есть - да, их можно подложить в pg_wal. База их в своём обычном цикле опроса источников wal увидит. Или переключить primary_conninfo на эту реплику, сама заберёт.

    Которая в свою очередь лочит базу

    basebackup не блокирует базу. Это вообще весьма простая и глупая по своей сути штука.

    Чтобы реплика при отсутствии необходимых WAL догнала primary - вам нужно знание внутренностей PGDATA. Которого у вас нет, что очевидно по вопросу "не станет ли слейв после этого мастером ?". А потому единственным простым и надёжным способом будет сделать pg_basebackup заново.
    Ответ написан
    Комментировать
  • Как работает поиск по комбинированным индексам?

    Melkij
    @Melkij
    PostgreSQL DBA
    Возможность у планировщика такая есть. bitmap index scan может объединять проход по нескольким индексам. Воспользуется ли планировщик этим планом или предпочтёт что-то другое и, тем более, будет ли это дешевле - зависит от статистики распределения данных, настроек, возможностей железа.

    Как решит планировщик в вашей системе - ответит explain. Сколько чего реально стоит в рантайме - ответит explain (analyze,buffers)

    Не обратил внимание на второй тег, это про postgresql было.

    mysql так же умеет, там называется Index Merge. Будет ли использоваться - опять же на усмотрение планировщика.
    Ответ написан
    2 комментария
  • Запрос в MySQL. Есть идея?

    Melkij
    @Melkij
    PostgreSQL DBA
    Для поиска самих link_id
    select link_id from tablename
    group by link_id
    having count(*) = sum(flag  = 1)

    Либо
    select id from links
    where exists(select null from tablename where flag  = 1 and link_id = links.id) -- возможно это условие вам по задаче не нужно
    and not exists(select null from tablename where flag != 1 and link_id = links.id)


    Вычитывать сами строки можно попробовать через
    select ...
    from tablename t
    where t.flag = 1
    and not exists(select null from tablename sq where sq.link_id = t.link_id and sq.flag != 1)


    При том, какой из вариантов эффективнее - критично зависит от распределения данных. При большой числе различающихся link_id с малым числом строк на каждый link_id и малым ожидаемом числе подходящих строк под задачу может быть эффективнее именно
    select ... from tablename t where t.link_id in (
    select q.link_id from tablename q
    group by q.link_id
    having count(*) = sum(flag  = 1)
    )


    При большом числе строк на каждый link_id и малом числе разных link_id может оказаться разумнее аналогично сначала достать link_id удовлетворяющие условию и по ним уже доставать данные.

    Третий запрос по ожиданию лучше отзовётся на случай малого числа flag = 1 строк в таблице.

    Самый быстрый на чтение вариант, впрочем, всё равно не выполнять обработку этого фильтра налету, а каким-то образом его материализовать и хранить предварительно рассчитанным.
    Ответ написан
    7 комментариев
  • Как составить сложный SQL запрос?

    Melkij
    @Melkij
    PostgreSQL DBA
    Каждая проверка - целостный срез данных? То есть может быть такое, что для фразы 5 последняя проверка была в 2020-07-05, а для фразы 6 надо отматывать в 2020-07-03?

    В общем-то, едим слона по частям:
    извлечь суммарную информацию: сколько позиций фраз выросло, сколько позиций просело, сколько позиций осталось неизменными

    select count(*) filter(where r1.position < r2.position) as pos_down,
    count(*) filter(where r1.position = r2.position) as pos_same,
    count(*) filter(where r1.position > r2.position) as pos_up from ...


    Укус второй: надо откуда-то получить r1 и r2 соответственно строки таблицы за сравниваемые срезы. Это
    tablename r1 full join tablename r2 on r1.phrase_id = r2.phrase_id where r1.... and r2....


    Доедаем слона:
    нужно дописать условие фильтрации и достать для r1 данные одного среза, для r2 - другого. Тут у вас не вполне конкретизировано что есть "предыдущая проверка". Например, достанем из таблицы tasks предыдущий task_id:
    where r2.task_id = 123 and r1.task_id in (select id from tasks where id < 123 order by id desc limit 1)
    Ответ написан
  • Зависают запросы postgres?

    Melkij
    @Melkij
    PostgreSQL DBA
    Отчётливо видно что запрос у вас for update, wait_event_type = Lock, wait_event = tuple.
    Следовательно запрос отнюдь не завис, всё так и должно быть. Какая-то другая транзакция уже взяла конфликтующую блокировку на эту строку и потому этот запрос ждёт чем та транзакция завершится.

    Какая сессия держит блокировку можно посмотреть, например, так: https://github.com/dataegret/pg-utils/blob/master/...
    Ответ написан
    Комментировать
  • RedBean - запрос update?

    Melkij
    @Melkij
    PostgreSQL DBA
    Как видно по наскальной живописи в комментарии (вместо нормального текста ошибки) - у вас не установлен mbstring
    Ответ написан
    1 комментарий
  • Как сделать запрос к 3 таблицам с условием where?

    Melkij
    @Melkij
    PostgreSQL DBA
    По одному полю с таблицы проще подзапросом.
    select 
      (select deal_id from table_1 where item_id = 9041) as deal_id_1
      (select deal_id from table_2 where item_id = 9041) as deal_id_2
      (select deal_id from table_3 where item_id = 9041) as deal_id_3
    Ответ написан
    Комментировать
  • Совместим процессор с материнской платой?

    Melkij
    @Melkij
    PostgreSQL DBA
    Нет. LGA 1151 несовместим с LGA 1155
    Ответ написан
    Комментировать
  • Есть ли разница для автовакуума как были удалены строки из таблицы?

    Melkij
    @Melkij
    PostgreSQL DBA
    После truncate автовакуум не запустится. Потому что зачем? Там пустой новый relfilenode для таблицы и всех индексов, что там пылесосить-то?
    Если из таблицы не нужны все данные - то truncate (или drop table) неисчислимо проще и быстрее для базы.
    Ответ написан
    Комментировать
  • Как работает DISTINCT ON?

    Melkij
    @Melkij
    PostgreSQL DBA
    Чем вам поможет ещё одно объяснение, если вы уже, как говорите, прочитали много других?

    distinct отвечает на вопрос "покажи уникальные комбинации таковых полей"
    distinct on расширяет стандартное поведение и отвечает на вопрос "покажи данные первой строки из каждой уникальной комбинации таковых полей". А для определения "первой строки" - делает обязательным использование order by.

    Используется когда вам нужно найти, например, данные по первому заказу каждого из покупателей в магазине.

    Note: postgresql на момент 13 версии не умеет loose index scan, потому distinct в лоб может быть в зависимости от распределения данных элегантен в написании, но не очень эффективен и объяснять более подходящий алгоритм придётся планировщику вручную.
    Ответ написан
    Комментировать
  • PostgreSQL модификация представления?

    Melkij
    @Melkij
    PostgreSQL DBA
    Drop view + create view новый. Без cascade удаление влияет только на сам view. Так что может быть необходимо аналогично удалить и создать вновь другие функции/view/прочее что ссылается на изменяемую view
    Ответ написан