Ответы пользователя по тегу PostgreSQL
  • Что быстрее SQL или Javascript?

    mayton2019
    @mayton2019
    Bigdata Engineer
    Мужские мужчины уже ответили на основной вопрос.

    Я добавлю что чем больше данных мы обрабатываем тем дороже становиться цена передчи
    информации из места где оно храниться в блок вычислений. В концепции трехзвенки которая
    описана RDS(Postgres)/NodeJS/Python/Web удобнее всего вычилсять прямо в Postgres. Поскольку
    данные рядом и сетевых расходов на передачу нет. Если Postgres по каким-то причинам не может
    вычислять или не владеет API то в этом случае мы с помощью курсора (SELECT) передаем
    нужный датасет на клиента (в данном случае это Python/Node) и там вычисляем. При этом
    мы должны понимать что это займет время и сетевой канал да еще и результат вычислений
    тоже надо отослать обратно. Тоесть данные будут бегать как рейсовый автобус туда-сюда.

    Для однозначного решения что хорошо и что плохо - надо ставить эскперимент. Но предварительно
    мне и присуствующим уже очевидно что лучше всего вычислять прямо в хранимых процедурах
    Postgres. Единственным доводом против может быть несовершенство языка PL/pgSQL
    но я-бы этот факт тоже проверил. Для реляционных задач его обычно хватало.

    Данная проблема (рейсовый автобус для данных) еще более сильно выражена в BigData. Там стараются
    дизайнить систему так что данные - write-only и после загрузки в хранилище (ETL/ELT) больше никогда
    не изменяются и лежат неподвижно (т.н. Bronze Level информации). И джобы которые бегают
    по ним - запускаются в вычислительном кластере физически рядом с дисковым хранилищем.

    Вот. А на клиента отдаются обычно сводные отчеты и кака-то аналитика. Это то что в 100-10000 раз меньше
    по размеру обычно чем основные данные.
    Ответ написан
    Комментировать
  • Какой уровень блокировки строк по умолчанию в запросе SELECT?

    mayton2019
    @mayton2019
    Bigdata Engineer
    Документация гласит

    https://www.postgresql.org/docs/current/transactio...

    Read Committed is the default isolation level in PostgreSQL.


    P.S. В Оракле - тоже самое.
    Ответ написан
    Комментировать
  • Почему возникает django.db.utils.OperationalError: consuming input failed: Operation timed out?

    mayton2019
    @mayton2019
    Bigdata Engineer
    --prefix, менял postgresql.conf и pg_hba.conf только чтобы слушал во вне

    А попробуй тоже самое собрать но без этих изменений.
    Ответ написан
  • Как подключиться к docker-контейнеру c PostgreSQL?

    mayton2019
    @mayton2019 Куратор тега Java
    Bigdata Engineer
    Кажется я так делал.
    docker network inspect .....

    покажет тебе IP-шники внутри той сети в которой ты стартовал контейнер. Вот туда и подключайся.
    Только в параметрах старта контейнера тебе надо имя этой сети указать.
    Ответ написан
  • Как сделать так, чтобы данные, которые я пишу в тг бота, заполняли сперва первую строчку в таблице postgre?

    mayton2019
    @mayton2019
    Bigdata Engineer
    Ну в базах данных так не делают. Обычно все колонки именованы и имеют смысл.

    У тебя есть два варианта КМК. Можно провести еще один сеанс нормализации и сделать табличку
    так.

    id| q  | value
    1 | q1 | 1111....
    1 | q2 | 2222....
    1 | q3 | 3333333
    2 | q1 |......


    или сделать value как JSON и складывать туда массив

    id| json_value
    1 | [ "11111", "2222", "333333" ....]
    Ответ написан
    Комментировать
  • Prisma, как обновить множество данных без лимита по количеству соединений?

    mayton2019
    @mayton2019
    Bigdata Engineer
    Ну ты можешь в качестве ключа использовать UUID. Так делают в распределенных системах когда много генераторов данных и все друг о друге не знают и не синхронизируются.

    Или можешь сам с собой договориться что каждому продюсеру данных дается диапазон. Для первого будет от 0 до 500 000 и для второго 500 001 до 1 000 000 и так далее.

    Есть генераторы основанные на текущем времени и мак-адресе хоста. Да много чего можно придумать.

    Игры в upsert или retry логикой могут заблокировать джобы надолго. Они могут кружиться в вальсе вместе
    постоянно наступая на конфликты. И это трудно пофиксить.
    Ответ написан
    Комментировать
  • Почему не работает автоинкрементация в PostgreSQL при помощи knex?

    mayton2019
    @mayton2019
    Bigdata Engineer
    Вот ошибка

    duplicate key value violates unique constraint "universitySpecialties_pkey"
    Ответ написан
  • Как перенести базу данных postgresql с Ubuntu на windows?

    mayton2019
    @mayton2019
    Bigdata Engineer
    Если кратко - то в Ubuntu делают pg_dump а в Windows - pg_restore.
    Все остальное - это просто детализация этой инструкции.
    Ответ написан
    Комментировать
  • Активно ли разработчики пользуются встроенными в Postgres функциями?

    mayton2019
    @mayton2019
    Bigdata Engineer
    Кину 5 копеек по поводу работы с датами. Да это зло. Работа с датами в современном API это
    самый большой технический долг начиная с Unix, когда дата представлялась секундами с 1970 года
    в виде DWORD. Я не встречал ни одного языка программирования и ни одной DBMS где изначально
    была-бы какая-то очень строгая и математичная концепция работы с временем. Везде были ограничители
    в основном завязанные на примитивные типы либо на строки вариативной длины. В Java например
    долгое время экплуатировался тип java.util.Date который сегодня считается дыркой (мутабельность)
    и неточным и его заменяют на java.time.* семейство типов. Параллельно с ним где-то в космосе
    висит java.sql.Date который декларирован в интерфейсах JDBC как основа для БД. С ним-же и работают
    все драйвера реляционных бд.

    По поводу вычислений на application tier. В последнее время DBMS девальвировали. И в основном
    используются в микросервисах как хранилище таблиц без особой логики. В этом есть свои смыслы.
    Например удобнее тестировать и хранить 100% кода в языках Java/Node/C#. Это создает гомогенность
    языка в проекте. В противном случае логику пришлось бы неизбежно резать на 2 слоя и хранить
    половину в application и другую половину деплоить через flyway/liquibase в БД при этом еще и
    не забыть тестировать 100% совместимость тех-же функций для работы дат-времени (никто
    кстати невкурсе что в Oracle год может быть 9999 а java.util.Date мне удалось сгенерировать
    такую Aug 17 09:12:55 EET 292 278 994. .. оптимистичненько доживем до 290 миллионов
    лет хотя проблема comparison этих типов остается) Стандарты ISO помогают но они скорее
    декларируют намерения сохранить нужное значение. Вот и если вы новичек - то я гарантирую
    что вы словите кайф в попытке в Java разобраться в проекте какой тип дат вам брать. И еще
    помножите это все на типы данных БД (их там будет 4 штуки обычно. Парочка для зональных
    и парочка для локальных).

    Использовать или нет функции PG? Ответ - it depends. В некоторых случаях оптимизатор не видит
    индекса если ты делаешь неявный кастинг из строки в дату например. Я тут не уверен надо проверять.
    Но есть старая админская поговорка. Плохой execution plan - проверь типы данных в предикатах.
    Беда реально существует для Spark/Databricks и даже включена в учебный план. По крайней мере int/Long
    различается на уровне Catalyst-optimizer. Вобщем если вы - лентяй то можете лупить строки вместо дат
    и надеятся что SQL машина правильно интерпретирует. Если вы хотите быть точным то делайте CAST или
    to_date с явным описаловом YYYY-MM и т.д.

    Еще один поинт в части где хранить логику. Это я пишу просто для кругозора. Чтобы топик
    не циклился вокруг Постгреса а люди видели пошире. В классических БД данные качаются
    к клиенту.
    Тоесть делаете SELECT * из миллирад строк - и этот миллиард будет прокачан до конца
    когда вы читаете резалт-сет по сети. Такова парадигма. Или курсор. Но суть таже. А в BigData данные
    лежат на месте но к ним "ходит" код
    . Вот такой метафизический парадокс. Сами понимаете что
    тут получается что встроенных функций даже как бы ... и нет. Подчеркиваю разницу.
    Ответ написан
    3 комментария
  • Как ускорить агрегацию данных в PostreSQL?

    mayton2019
    @mayton2019
    Bigdata Engineer
    Ммм... Можно данные разбить по периодам. Месяцы. Годы. Кварталы. И считать агрегации только по последнему
    закрытому периоду. А по старым - считать не надо. Потому что уже посчитаны. Главное сохранить куда-то.
    Типа analytic_table.
    Раньше эта техника называлась OLAP. А щас ее вроде бы уже не используют. Заменили на BigData.
    Ответ написан
  • Как наладить связи в бд?

    mayton2019
    @mayton2019
    Bigdata Engineer
    famsssss это ETL с нормализацией. Задача - типичная.
    У тебя должен быть примерно такой план действий.

    1) Таблицы vak, ring, mdb, cat, spec нужно загрузить в БД как есть. В денормализованном виде. Если они лежат в excel - то сохранить их как CSV формат. Далее дело техники. Можете задать другой вопрос в qna по поводу того как их грузить.

    2) Надо нарисовать реляционную модель. Это примерно то что ты рисуешь в картинке но нужно рисовать от сущности-связи а не от того какие файлы даны. Например есть сущность ISNN. У нее есть какие-то атрибуты. Они возможно опциональные. Но они должны быть перечислены. Далее - другие сущности. Потом определяем связи между ними. Например если многим spec соотвествует один ISNN - то тип связи будет многие к одному. Бывает такое что между двумя сущностями связи многие-ко-многим. Как прямоугольная матрица где по горизонтали одна сущность а по вертикали - другая и на пересечении стоит YES когда связь в наличии. Это тоже можно. Это делается через промежуточную таблицу. Связи бывают рекурсивные (таблица может указывать сама на себя). И в РМ могут быть циклы и петли. Это тоже допускается. Просто в этом случае между сущностями будут несколько вариантов как их джойнить и все варианты верны.

    3) После того как Реляционная Модель (РМ) определена - в нее можно загружать данные. Можно грузить через INSERT/UPDATE/MERGE. И если возможностей не хватит то можно брать хранимые процедуры на Postgres. Но обычно мне хватало и SQL. В крайнем случае можно брать языки типа Python, Ruby e.t.c. если например доменная модель ооооочень сложная и надо какие-то делать неочевидные поиски по коллекциям или работать с JSON/XML но у тебя вроде все атомарно и лежит просто в ячейках. Должно хватить SQL.

    4) Последняя таблица izdanya - по смыслу является отчетом из основной модели. Я настаиваю именно на таком подходе. Физически - это может быть view или таблица неважно. Главное что она - вторична по отношению к модели.
    Ответ написан
    Комментировать
  • Как с помощью TimescaleDB реализовать выгрузку последних данных с разбивкой по устройствам?

    mayton2019
    @mayton2019
    Bigdata Engineer
    А попробуй убери из индекса дату.

    CREATE INDEX ix_imei_time ON locations (imei);

    Я не работал с TimescaleDB но вообще работать со вторичными индексами в time-series - это плохая тема.
    Лучше выбрать лидирующий партишен как дата. И вторичный партишен как хеш от какого-то интересующего
    атрибута или группы атрибутов. И тогда оптимизатор пойдет просто в тот фасет который соотвествует нужному
    пересечению партишенов.
    Ответ написан
  • Почему postgres не считает null уникальным значением?

    mayton2019
    @mayton2019
    Bigdata Engineer
    Если смотреть на проблему с точки зрения теории множеств - то использовать null - это так себе идея.
    Ведь в данном контексте пустое поле входит в состав ключевых. Атрибуты - да. Могут быть пустыми и не
    заполненными пользователем. Но ключи с пустотами вызывают еще больше вопросов если у вас
    будет задача ссылочной целосности например.
    Ответ написан
    2 комментария
  • Как правильно запускать хранимые процедуры?

    mayton2019
    @mayton2019
    Bigdata Engineer
    Обычно в проекте заводят отдельный модуль. Версионный контроль для БД. Можно на базе
    liquibase или flyway. Можно на базе каких-то Go-технологий.

    Но суть такова. Хранимка устанавливается синхронно с обновлением версии комплекса. Как
    часть установочного pipeline. И далее из кода ты ее просто вызываешь по имени.
    Ответ написан
    Комментировать
  • Как в PostgreSQL вывести все названия таблиц и определенные столбцы из каждой?

    mayton2019
    @mayton2019
    Bigdata Engineer
    Сбор мета-данных по БД - это та часть SQL которая не урегулирована стандартом. И каждый вендор БД делают свои имена справочников таблиц. У Постгреса это будет information_schema.columns у Oracle - ALL_TAB_COLUMNS и т.д.

    Среди CLI инструментов тоже нет единого видения как собирать данные о схеме. Разные команды листинга.

    Единственную попытку стандартизировать я видел в семействе Java JDBC драйверов. Там с помощью интерфейсов DatabaseMetaData, ResultSet и Connection программист может собрать мету о таблицах.
    Ответ написан
    Комментировать
  • Как реализовать поиск в postgresql с Sequelize, в котором будет поиск в ячейке по словам в различном порядке?

    mayton2019
    @mayton2019
    Bigdata Engineer
    Нужно найти такие строки, в которых будет и 'one' и 'two', не зависимо от порядка

    Это задача на full text search. Начни читать отсюда

    https://www.postgresql.org/docs/current/textsearch...
    Ответ написан
    Комментировать
  • Как правильно организовать поиск по большому кол-во бд?

    mayton2019
    @mayton2019
    Bigdata Engineer
    Как сделать поиск максимально производительным? Что использовать? Асинхронность? Многопоточность?

    Оптимизация запроса к БД начинается с того что вы выделяете сет активных запросов которые важны для вас.
    Для каждого из них строите план исполнения запросов
    EXPLAIN [ ANALYZE ] [ VERBOSE ] ......
    Потом с этим планом приходите к специалисту (или сюда) и спрашиваете что надо улучшить в
    тексте запроса или в таблице или в индексе чтоб было быстрее.

    Добавление большего числа исполнительных потоков (сессий БД) обычно не улучшает ситуацию
    а только ухудшает. Практика это показывает. Мы быстро выходим на пологую кривую пропускной
    способности диска - и дальше хоть добавляй потоки - все будет только хуже.

    Насчет асинхронных операций - не знаю. Если мы работаем через пул коннектов - то надо обсудить
    построение абстракции асинхронности над абстракцией пула. Это тема отдельного топика.
    Ответ написан
    Комментировать
  • Как произвести аналитику изменений и определить причину роста объёма базы?

    mayton2019
    @mayton2019
    Bigdata Engineer
    Не знаю как щас. А лет 10 назад базы обслуживал DBA. Это был инженер и хозяйственник. Кроме того что он знал бизнес. Он также знал примерный объем таблиц в гигабайтах и в миллионах строк. Не обязательно все а хотя-бы топ 10. И даже если какая-то из них внезапно опухла - то это было-бы лакмусом того что в системе что-то пошло не так. (Я в бытность DBA-администраторства знал примерно сколько в день растут таблицы бизнес-фактов и сколько архивных логов накатывает Oracle). Обычно схема даже очень сложных систем состоит из справочников которые не растут. И из таблиц бизнес-операций которые и нужно держать под наблюдением. И их не очень много.

    Вот тут пишут как посмотреть размер таблиц https://stackoverflow.com/questions/21738408/postg...

    Количество строк - сами напишете. Ну и мониторинг и еще раз мониторинг. Возможно причины - банальны. Переход на новую версию комплекса в процессе которого были добавлены новые колонки например.

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

    mayton2019
    @mayton2019
    Bigdata Engineer
    Вот тут примеры и синтаксис пишут

    https://wiki.postgresql.org/wiki/UPSERT
    Ответ написан
    Комментировать
  • Как в PostgreSQL хранить 16-ричные числа?

    mayton2019
    @mayton2019
    Bigdata Engineer
    Автор пишет

    Строчкой затратно и тупо


    А кто знает расход памяти Postgresql на 1 datarow? Я не предлагаю в топике вывести формулу. Обычно ее нет
    либо она - приближенная. Но мы помним что postgresql хранит для каждой строки системные колонки.

    Документация упоминает их 6 штук https://www.postgresql.org/docs/current/ddl-system...
    Пишут что xmin и cmax - по 32 бита длиной.

    Вот. Значит торг автора между 16-ричным например и 10-ным вобщем не сильно оказывает влияние на размер строки. Я-бы предложил вообще не сильно его рассматривать. Но если кто-то нарисует нам все-таки формулу
    расчета физической длины строки - то будет неплохо.

    UPD: написал data-row. Это корректнее чем просто строка. А то непонятно.
    UPD: 16 ричное десятичное
    Ответ написан