Ответы пользователя по тегу PostgreSQL
  • Кто может объяснить суть блокировок PostgreSQL на пальцах?

    Falseclock
    @Falseclock
    решаю нестандартные задачи
    Типичный случай - транзакция.
    Вы начинаете делать большой апдейт, который допустим займет 3 минуты, а в это время кто-то еще пытается изменить. Таблица блокируется на изменение пока не закончится длинная транзакция. А если сделать select ... for update, то таблица залочится даже для селектов.

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

    https://postgrespro.ru/docs/postgrespro/10/explici...
    Ответ написан
    Комментировать
  • Как правильно вносить данные в БД?

    Falseclock
    @Falseclock
    решаю нестандартные задачи
    У меня был похожий случай.

    1. Имеем веб морду.
    2. Есть большая таблица, в которой куча табличных ячеек.
    3. Необходимо на всех клиентских машинах отображать актуальные данные без перезагрузки страницы

    Я сперва реализовал следующим образом:

    1. Поднял WebSocket который слушали все клиенты.
    2. Поднял демона, который опрашивал Rest и вытаскивал данные.
    3. В случае новых данных демон сувал их в базу и через WebSocket отправлял широковещательное сообщение в виде JSON строки.
    4. Со стороны клиента через JS вытаскивал данные с сокета и обновлял пользователю интерфейс.
    5. Все пользователи имеют актуальные данные без перезагрузки страницы.

    Как опрашивал Rest.
    1. Создал табличку text + int.
    2. В text хранил название таблицы интерфейса, в int - последний инкремент
    3. Опрашивал с условием > int
    4. Ложил в локальную базу.
    5. Оповещал клиентов по WebSocket

    Сечас немного по другому. В 1С есть подписка на события, при изменении или создании документа можно вызвать обработчика, в моем случае просто происходил HTTP запрос с передачей данных в post теле JSON сериализации.

    В вашем случае, если не важно и не актуально, либо не возможно изменение документа - только такой вариант: постоянный опрос.
    Ответ написан
    Комментировать
  • 5 мегабайт БД данных (на Postresql) это примерно сколько строк в одной таблице?

    Falseclock
    @Falseclock
    решаю нестандартные задачи
    Не правильный вопрос.

    Зависит от типа и количества колонок в таблице. Каждая база по своему хранит те же самые текстовые поля или индексы.

    Вот пример сколько весят 5 миллионов строк с текстом, индексом и без

    211 мб - просто таблица
    287 мб - с текстовым полем
    394 мб - с индексом по int полю
    545 мб - с индексоп по text полю

    virtex_old2=# create table test (id serial, amount numeric, customer numeric);
    CREATE TABLE
    virtex_old2=# INSERT INTO test(amount,customer)  SELECT amount, customer FROM (SELECT generate_series(1,5000000) as id, (random()*10000)::int AS amount, (random()*10000)::int AS customer) as aa;
    INSERT 0 5000000
    virtex_old2=# SELECT nspname || '.' || relname AS "relation",
    virtex_old2-#     pg_size_pretty(pg_total_relation_size(C.oid)) AS "total_size"
    virtex_old2-#   FROM pg_class C
    virtex_old2-#   LEFT JOIN pg_namespace N ON (N.oid = C.relnamespace)
    virtex_old2-#   WHERE nspname NOT IN ('pg_catalog', 'information_schema')
    virtex_old2-#     AND C.relkind <> 'i'
    virtex_old2-#     AND nspname !~ '^pg_toast'
    virtex_old2-#     AND relname = 'test';
      relation   | total_size
    -------------+------------
     public.test | 211 MB
    (1 row)
    virtex_old2=# ALTER TABLE test
      ADD COLUMN comment text NOT NULL DEFAULT 'text is here';
    ALTER TABLE
    virtex_old2=#
    virtex_old2=# SELECT nspname || '.' || relname AS "relation",
        pg_size_pretty(pg_total_relation_size(C.oid)) AS "total_size"
      FROM pg_class C
      LEFT JOIN pg_namespace N ON (N.oid = C.relnamespace)
      WHERE nspname NOT IN ('pg_catalog', 'information_schema')
        AND C.relkind <> 'i'
        AND nspname !~ '^pg_toast'
        AND relname = 'test';
      relation   | total_size
    -------------+------------
     public.test | 287 MB
     
    virtex_old2=# CREATE INDEX ON test (customer);
    CREATE INDEX
    virtex_old2=# SELECT nspname || '.' || relname AS "relation",
        pg_size_pretty(pg_total_relation_size(C.oid)) AS "total_size"
      FROM pg_class C
      LEFT JOIN pg_namespace N ON (N.oid = C.relnamespace)
      WHERE nspname NOT IN ('pg_catalog', 'information_schema')
        AND C.relkind <> 'i'
        AND nspname !~ '^pg_toast'
        AND relname = 'test';
      relation   | total_size
    -------------+------------
     public.test | 394 MB
    (1 row)
    virtex_old2=# CREATE INDEX ON test (comment);
    CREATE INDEX
    virtex_old2=# SELECT nspname || '.' || relname AS "relation",
        pg_size_pretty(pg_total_relation_size(C.oid)) AS "total_size"
      FROM pg_class C
      LEFT JOIN pg_namespace N ON (N.oid = C.relnamespace)
      WHERE nspname NOT IN ('pg_catalog', 'information_schema')
        AND C.relkind <> 'i'
        AND nspname !~ '^pg_toast'
        AND relname = 'test';
      relation   | total_size
    -------------+------------
     public.test | 545 MB
    (1 row)
    Ответ написан
    Комментировать
  • Почему не работает сортировка в PostgreSQL?

    Falseclock
    @Falseclock
    решаю нестандартные задачи
    ORDER BY city
    Ответ написан
    Комментировать
  • Как в PostgreSQL написать запрос, проверяющий диапазон ip адресов?

    Falseclock
    @Falseclock
    решаю нестандартные задачи
    Например входит ли адрес 192.168.0.100 в сеть 192.168.0.0/24
    postgres=# select  inet '192.168.0.100' <<= inet '192.168.0.0/24';
     ?column?
    ----------
     t
    (1 row)


    или
    Входит ли IP адрес 192.168.2.112 в диапазон между 192.168.0.0 и 192.168.10.255
    postgres=# select  inet '192.168.2.112' >= inet '192.168.0.0' AND inet '192.168.2.112' <= inet '192.168.10.255';
     ?column?
    ----------
     t
    (1 row)
    
    postgres=#
    Ответ написан
    2 комментария
  • Как взять предпоследние значение перед вставкой новой записи в большой таблице СУБД postgres?

    Falseclock
    @Falseclock
    решаю нестандартные задачи
    а чем RETURNING не нравится?

    Туда же можно привязать что угодно

    Я например удаляя какие-то данные вытаскиваю что вообще удалилось и джоинами прикручиваю все что мне нужно вытащить. например

    DELETE FROM 
    				waybills 
    			USING 
    				invoices 
    			JOIN invoice_data ON
    				invoice_data.invoice_uuid = invoices.invoice_uuid
    			WHERE 
    				waybills.invoice_uuid = waybills.invoice_uuid AND 
    				waybills.waybill_uuid = ?
    			RETURNING 
    				invoice_data.order_data_id,
    				invoices.order_id,
    				invoices.invoice_uuid


    Вы же в своем инсерте также можете добавить RETURNING и указать что вы хотите вернуть )))
    Ответ написан
  • Как заставить DateTime field сохранять корректное текущее время?

    Falseclock
    @Falseclock
    решаю нестандартные задачи
    что-то вы перемудрили и сами себя запутали.

    вы определитесь как хотите время хранить. Постгрес предлагает хранит время с временной зоной или без временной зоны.
    https://www.postgresql.org/docs/9.6/static/datatyp...

    Вы в конце времени ставите +07, а значит время с временной зоной.

    сделайте поле без временной зоны, а со стороны языка решите какое время вы будете хранить в базе, UTC или локальное время, потому что иначе будете путаться и лишний раз одно время переводить в другое. Если поле без временной зоны, то оно будет игнорировать зону и сохранять значение без конвертации.
    Ответ написан
  • Можно сделать UPDATE (SQL) с выводом, какие строки не найдены?

    Falseclock
    @Falseclock
    решаю нестандартные задачи
    Делаете временную таблицу, в нее выгружаете уникальные идентификаторы, затем делаете апдейт с возвратом UPDATE from bla bla bla RETURNING, который джоинете с выгруженными данными во времянку.

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

    Falseclock
    @Falseclock
    решаю нестандартные задачи
    Вообще в данном случае требуется три таблицы:

    1. таблица с сущностью
    question_id serial
    question_type enum
    question_date
    question_foo и другие параметры

    2. Таблица с вопросами, где может быть 1 вопрос или несколько
    question_data_id serial
    question_data_text text
    question_id int - ссылка на родителя

    3. Таблица ответов
    question_data_answer_id - serial
    question_data_answer_text - txt
    question_data_answer_score - int
    question_data_id - ссылка на родительскую таблицу

    Все... В зависимости от question_type будете формировать разные виды построения опросника. Целостность соблюдается.
    Ответ написан
    Комментировать
  • Стоит ли использовать uuid или есть что-то еще?

    Falseclock
    @Falseclock
    решаю нестандартные задачи
    А зачем знать заранее? Не представляю себе такого.
    Если после внесения новой строки в базу хотите знать уникальный ID сформированный в базе, то делаете так

    INSERT INTO table_name (column1,column2) VALUES (value1,value2) RETURNING table_column_id;
    Ответ написан
    Комментировать
  • Как создать дерево в perl из SQL запроса?

    Falseclock
    @Falseclock
    решаю нестандартные задачи
    Вопрос не корректный. Точнее не понятно что именно преследуете.
    На Postgres можно вытащить в виде дерева через XML
    www.postgresql.org/docs/9.4/static/functions-xml.h...

    а дальше как угодно парсить.
    Ответ написан
    Комментировать