Задать вопрос
  • Как создать уникальный индекс с условием?

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

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

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

    Melkij
    @Melkij
    DBA для вашего PostgreSQL?
    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
    DBA для вашего PostgreSQL?
    скопировать с мастера папку pg_wal с файлами

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

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

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

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

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

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

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

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

    Melkij
    @Melkij
    DBA для вашего PostgreSQL?
    (query 1) except (query 2);
    (query 2) except (query 1);
    Ответ написан
    2 комментария
  • Запрос в MySQL. Есть идея?

    Melkij
    @Melkij
    DBA для вашего PostgreSQL?
    Для поиска самих 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
    DBA для вашего PostgreSQL?
    Каждая проверка - целостный срез данных? То есть может быть такое, что для фразы 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
    DBA для вашего PostgreSQL?
    Отчётливо видно что запрос у вас for update, wait_event_type = Lock, wait_event = tuple.
    Следовательно запрос отнюдь не завис, всё так и должно быть. Какая-то другая транзакция уже взяла конфликтующую блокировку на эту строку и потому этот запрос ждёт чем та транзакция завершится.

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

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

    Melkij
    @Melkij
    DBA для вашего PostgreSQL?
    По одному полю с таблицы проще подзапросом.
    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
    DBA для вашего PostgreSQL?
    Нет. LGA 1151 несовместим с LGA 1155
    Ответ написан
    Комментировать
  • Есть ли разница для автовакуума как были удалены строки из таблицы?

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

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

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

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

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

    Melkij
    @Melkij
    DBA для вашего PostgreSQL?
    Cnt число?
    Select cnt * interval '1 day'
    Ответ написан
  • PostgreSQL модификация представления?

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

    Melkij
    @Melkij
    DBA для вашего PostgreSQL?
    mdadm --grow /dev/md0 --size=max
    Насколько по ману вижу увеличение размера для raid0 поддерживается. Сначала командуете для нижележащих массивов, потом для верхнего raid0.

    Проверить что массиву вообще есть куда расширяться можно запросив -E для каждого из томов массива:
    sudo mdadm -E /dev/sde2
    ....
     Avail Dev Size : 5767168000 (2750.00 GiB 2952.79 GB)
         Array Size : 7759462400 (7400.00 GiB 7945.69 GB)
      Used Dev Size : 3879731200 (1850.00 GiB 1986.42 GB)
    ...

    Если есть отдельная строка Used Dev Size с размером меньше Avail Dev Size - расширять есть куда.
    Ответ написан
    Комментировать
  • Как сделать дамп если мы не знаем имя базы, а хотим дампить все по одной?

    Melkij
    @Melkij
    DBA для вашего PostgreSQL?
    select datname from pg_database where datallowconn and datname != 'template0'

    Как pg_dumpall
    Ответ написан
    1 комментарий
  • Как сделать расширение перемещаемым?

    Melkij
    @Melkij
    DBA для вашего PostgreSQL?
    создавал через create schema

    this is only possible if the extension contains no internal assumptions about what schema any of its objects are in

    Как сделать, чтобы расширение было перемещаемым?
    откуда в вашем sql взялся create schema, любые на него ссылки в именах объектов


    Ну не может быть в relocatable расширении никаких create schema либо ссылок на них.
    Ответ написан