Задать вопрос
Ответы пользователя по тегу PostgreSQL
  • Postgresql Exclusion constraints, хочется странного?

    Melkij
    @Melkij
    DBA для вашего PostgreSQL?
    CREATE UNIQUE INDEX test_good_default_goods ON test_good (good_id)
    WHERE by_default = true

    Это ограничение целостности, чтобы не отстрелить себе ногу.

    Обновление:
    Вместо
    update test_good set by_default = true where id = :id

    и какой-то фоновой магии, обновлять вот так:
    update test_good set by_default = (id = :new_default_id) where good_id = :good_id

    Если надо, uuid можно подзапросом по тому же самому :new_default_id вытащить.
    Впрочем, возможно этот апдейт споткнётся на уникальном индексе, не помню точно, когда уникальность проверяется - для всего выражения или для каждой строки. Ну, можно будет переписать запрос. В конце концов, у нас ещё есть CTE.
    Ответ написан
    Комментировать
  • Почему запрос postgres выдает на выходе массив?

    Melkij
    @Melkij
    DBA для вашего PostgreSQL?
    Затем вы делаете группировку, когда вам нужен order by + limit 1?
    Ответ написан
    Комментировать
  • Почему PostgreSQL использует неоптимальный план выполнения для простого запроса?

    Melkij
    @Melkij
    DBA для вашего PostgreSQL?
    Обычно делают counter_id in (6001, 15998) а не толпу or.
    explain analyze select max(time) from params where counter_id in (6001, 15998);

    Aggregate (cost=18.52..18.53 rows=1 width=8) (actual time=1.586..1.586 rows=1 loops=1)
    -> Index Only Scan using params_counter_id_time_idx on params (cost=0.56..18.51 rows=4 width=8) (actual time=0.769..1.566 rows=12 loops=1)
    Index Cond: (counter_id = ANY ('{6001,15998}'::bigint[]))
    Heap Fetches: 2
    Planning time: 50.191 ms
    Execution time: 1.933 ms

    Тут на порядок поменьше данных, это просто виртуалка и pg ещё 9.4

    or две минуты исполнения тоже не даёт:
    Aggregate (cost=25.20..25.21 rows=1 width=8) (actual time=38.797..38.797 rows=1 loops=1)
    -> Bitmap Heap Scan on params (cost=9.16..25.19 rows=4 width=8) (actual time=0.362..38.749 rows=12 loops=1)
    Recheck Cond: ((counter_id = 6001) OR (counter_id = 15998))
    Heap Blocks: exact=12
    -> BitmapOr (cost=9.16..9.16 rows=4 width=0) (actual time=0.042..0.042 rows=0 loops=1)
    -> Bitmap Index Scan on params_counter_id_time_idx (cost=0.00..4.58 rows=2 width=0) (actual time=0.031..0.031 rows=6 loops=1)
    Index Cond: (counter_id = 6001)
    -> Bitmap Index Scan on params_counter_id_time_idx (cost=0.00..4.58 rows=2 width=0) (actual time=0.009..0.009 rows=6 loops=1)
    Index Cond: (counter_id = 15998)
    Planning time: 0.247 ms
    Execution time: 39.408 ms


    Попробуйте сделать analyze params;
    Может, у планировщика статистика старая.
    Ответ написан
  • Имеет ли смысл использовать SMALLINT вместо INT (PostgreSQL)?

    Melkij
    @Melkij
    DBA для вашего PostgreSQL?
    int всегда 4 байта, smallint всегда 2 байта.
    Меньше байт занимают данные - значит в тот же объём памяти на железке войдёт больше данных, и меньше данных надо будет прогонять через диски. Меньше работы дискам - это всегда плюс в производительности СУБД.
    При том, данные меньше занимают места и в таблицах и в индексах.

    Но это если у вас порядком целочисленных данных, а не какие-нибудь считанные миллионны строк. Что такое экономия десятка мегабайт данных на машинке с несколькими десятками гигабайт памяти?
    Иначе использование подходящих типов это вежливость, проявление профессионализма и лишний способ случайно не отстрелить себе ногу (по ошибке записать что-то совсем странное уже не получится).
    Ответ написан
    Комментировать
  • Как создать UPDATE триггер без рекурсии в Postgres?

    Melkij
    @Melkij
    DBA для вашего PostgreSQL?
    id - это primary key? Т.е. изменять надо именно эту самую строку? Тогда before insert or update и меняется сам NEW:
    IF NEW.balance<NEW.amount THEN
        NEW.is_paid_mode=0;
      ELSE
        NEW.is_paid_mode=1;
      END IF;
    RETURN NEW;
    Ответ написан
  • Как выполнить запрос с условием?

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

    Melkij
    @Melkij
    DBA для вашего PostgreSQL?
    Есть View. Планировщику придёт что-то похожее на изначальный запрос и дальше он будет переписывать запрос. Т.е. что-то подобное пункту 1.

    Есть Materialized Views. Это пункт 2. www.postgresql.org/docs/9.4/static/rules-materiali...
    Ответ написан
  • Как получить все записи с определенным значением в поле JSONB?

    Melkij
    @Melkij
    DBA для вашего PostgreSQL?
    Забавно.
    Пересечения работают, можно их использовать.
    select '[1,2,3]'::jsonb @> '[2]'::jsonb;
    Ответ написан
    Комментировать
  • Как правильно сделать update postgresql?

    Melkij
    @Melkij
    DBA для вашего PostgreSQL?
    При чтении использовать order by.
    Пока нет order by, по самому стандарту SQL порядок строк не определён.
    Ответ написан
    Комментировать
  • Как ускорить запрос в postgresql?

    Melkij
    @Melkij
    DBA для вашего PostgreSQL?
    По порядку:
    Повторно запрос выполняется много быстрее.

    Значит, вы с головой упёрлись в диск.
    Вариант есть только один - ставить быстрый диск.
    Вариант похуже, т.к. диск всё равно у вас останется медленный и если не на чтении, то на старте и на записи вы туда упрётесь очень хорошо - использовать больше памяти. Чтобы как можно данных было в памяти. Но при работе эти данные всё равно надо поднимать с медленных дисков, потому базу сначала придётся разогревать. Есть даже штатная утилитка pg_prewarm

    В конфиге postgresql менял настройки только авторизации.

    По дефолту там что-то несмешное вместо shared_buffers. 32 что ли мегабайта? И это на ключевую характеристику базы.
    Увеличивать хотя бы до 20% от общего объёма памяти на машине.

    В третьих, актуальный Postgresql довольно плохо умеет развесистый IN. И тому есть не совсем очевидное решение - переписать в join:
    select count(*) from test JOIN (VALUES (1),...,(10000)) AS v(val) USING (val);

    Такой вот hash join работает быстрее IN. На 10000 элементах получали 10мс против 380мс у IN.
    Ответ написан
    Комментировать
  • Можно ли создать уникальный ключ по месяцу и году?

    Melkij
    @Melkij
    DBA для вашего PostgreSQL?
    В Postgresql - да, можно: www.postgresql.org/docs/9.4/static/indexes-express...
    Строить индекс можно для любой immutable функции, в том числе для пользовательской.

    Только лучше не to_char, а date_trunc('month', f_DateAnaliz). Индекс получится компактнее.
    Ответ написан
    Комментировать
  • Архитектура децентрализованного (рапределенного) приложения?

    Melkij
    @Melkij
    DBA для вашего PostgreSQL?
    О CAP теореме слышали?
    Вы хотите иметь доступность и устойчивость к разделению, следовательно, вы должны отказаться от консистентности. См. AP-системы.
    Нормальный ли подход - зависит от задачи, нужно рассматривать конкретную ситуацию и конкретный бизнес. Если ограничения целостности позволяют, то да, нормальный. План слияния и решения конфликтов только заранее описать.
    Ответ написан
    1 комментарий
  • Как достать postgres-БД из бекапа FS Ubuntu?

    Melkij
    @Melkij
    DBA для вашего PostgreSQL?
    Бази данных физически должны находиться в data_directory = '/var/lib/postgresql/9.3/main'..

    Но там их нет:
    /opt/backup/etc/postgresql/9.3/main$ ls -al

    Мысль логична, но почему смотрите-то в etc, а не в var?
    Ответ написан
    Комментировать
  • Как парсить записи средствами PostgreSQL?

    Melkij
    @Melkij
    DBA для вашего PostgreSQL?
    Например,
    CREATE OR REPLACE FUNCTION process_data(
        s_input text
    )
    RETURNS void
    AS $function$
    DECLARE
        a_data text[];
    BEGIN
    
        a_data := regexp_matches(s_input, '^Login: ([^;]+); IP ([\d\.]+); Time: ([\d\:\.\s]+)$');
    
        raise notice 'Login %', a_data[1];
        raise notice 'IP %', a_data[2];
        raise notice 'Time %', to_timestamp(a_data[3], 'DD.MM.YYYY HH24:MI:SS');
    
    END;
    $function$
    LANGUAGE plpgsql STABLE SECURITY DEFINER;
    Ответ написан
    Комментировать
  • Postgres сумма за разные интервалы?

    Melkij
    @Melkij
    DBA для вашего PostgreSQL?
    Чуток вычислительной нагрузки:
    select
    sum(value) as month_sum,
    sum(case when CURRENT_DATE =f_timestamp::date then value else 0 end) as today_sum
    from ... where за этот месяц
    Ответ написан
    Комментировать
  • Как правильно работать с полями JSON в Postgresql?

    Melkij
    @Melkij
    DBA для вашего PostgreSQL?
    Что подразумеваете под "работать"? Начиная с 9.3 доступно вот такое: www.postgresql.org/docs/9.3/static/functions-json.html
    Ответ написан
    Комментировать
  • Как перевести этот запрос из MySQL в PostgreSQL?

    Melkij
    @Melkij
    DBA для вашего PostgreSQL?
    SELECT * FROM (
    SELECT *, row_number() OVER(ORDER BY score DESC) AS 'place'
     FROM test 
     ORDER BY place
    ) t1
     WHERE id = 1;

    ?
    Ответ написан
    1 комментарий
  • Как настроить репликацию PostgreSQL с серого IP-адреса?

    Melkij
    @Melkij
    DBA для вашего PostgreSQL?
    Туннель, может лучше будет сделать?
    Поверх SSH или какой-нибудь VPN.
    Ответ написан
    2 комментария
  • Как расчитать объем данных Postgresql?

    Melkij
    @Melkij
    DBA для вашего PostgreSQL?
    Только insert/select - прямая зависимость от таблиц, их полей и индексов.
    Как только появляется update/delete - результат назвать невозможно. Из-за MVCC, работы вакуума, требований приложения к длительности транзакций и интенсивности update/delete - размер данных на диске может заметно превышать объём дампа этих же самых данных.

    ИМХО, рассчитывать не имеет смысла. Ставите мониторинг, запускаете в бой, смотрите статистику и тренд. Сразу видно, с какой скоростью база растёт, когда кончится место на диске, когда (что куда вероятнее) - iops'ы.
    Ответ написан
  • Где ошибка в запросе sql?

    Melkij
    @Melkij
    DBA для вашего PostgreSQL?
    Как ни странно, но, может быть, таких строк действительно нет?
    Ответ написан