Ответы пользователя по тегу Базы данных
  • Что за магия с PostgreSQL?

    Melkij
    @Melkij
    PostgreSQL DBA
    приведение массива record к массиву композитного типа позиционное, а не символьное. Поменяйте в
    SELECT DISTINCT ON (asin) asin, price, reviews, raing

    порядок полей на совпадающий с таковым в таблице.

    убрали бы лишние подзапросы, что ли.
    (SELECT array_agg(j) FROM (SELECT DISTINCT ON (j.asin) j FROM jsonb_populate_recordset(NULL::t_best_asin_ranking_2, '[{
    "asin":"B06XH9FNH1",                                                                                                  
    "price": 1.5,                                                                                                   
    "rating": 1.5,
    "reviews": 1
    }]') j ORDER BY j.asin) r);

    вот так хотя бы.
    Ответ написан
    4 комментария
  • Не могу выполнить запрос к БД используя PDO. В чём проблема?

    Melkij
    @Melkij
    PostgreSQL DBA
    Как должно быть видно по тексту ошибки, ругается не PHP, а совсем даже СУБД.

    TLDR: структура запроса (например, сортировка) через prepared statements изменяться не может. Только константы в запросе.
    Ответ написан
    Комментировать
  • Почему иногда практикуется отсутствие связей в БД?

    Melkij
    @Melkij
    PostgreSQL DBA
    Не связано с микросервисами никак. Может встретиться в любых приложениях, работающих с базой.

    Кто-то забывает делать ограничения в схеме БД. Кто-то может вовсе не знать, что FK и check constraints существуют. Кто-то считает что проверки на приложении достаточно. (в этом случае бывает забавно показать примеры уже лежащих в БД данных, невозможных с точки зрения логики приложения)

    Сознательный, реально обоснованный отказ от FK - штука крайне редкая
    Ответ написан
    Комментировать
  • Какую базу и способ хранения выбрать?

    Melkij
    @Melkij
    PostgreSQL DBA
    База на 30гб? Какая смешная кроха.

    Да сгенерируйте себе синтетических данных и поиграйтесь с ними. Я понимаю неудобно на локальной машине щупать базу в десяток террабайт - но лишь только 30гб не проблема просто сгенерировать и посмотреть вживую.
    Ответ написан
    1 комментарий
  • Какую базу данных выбрать для сервера на Node.js?

    Melkij
    @Melkij
    PostgreSQL DBA
    Доступ к DB Read Only. Т.е. после сдачи сервера в эксплуатацию DB не меняется.

    Поиск нужной записи по одному ID.

    При старте приложения загрузить в память приложения хоть из рядового csv или чего угодно ещё.
    При этих ограничениях задачи внешняя БД избыточна.
    Ответ написан
    5 комментариев
  • Как реализовать ACID и транзакции на примере БД в виде простого текстового файла?

    Melkij
    @Melkij
    PostgreSQL DBA
    Реализовать, по сути, половину СУБД.
    Начните с талмуда Transactional Information Systems, by Gerhard Weikum and Gottfried Vossen, Morgan Kaufmann
    Ответ написан
    Комментировать
  • Где и как хранить таблицу на 1 миллиард записей?

    Melkij
    @Melkij
    PostgreSQL DBA
    Определитесь с тем как вы будете удалять эти данные.

    3 колонки id, factor_id, parcel_id

    Данную таблицу не надо анализировать или агрегировать. Нужно только иметь возможность быстро вставить и прочитать запись.

    Очень большое сомнение что вам здесь нужен id вместо составного pk.

    увеличивается примерно на 100к записей в день

    Т.е. сейчас у вас данные за 15 лет работы и вас беспокоит что будет ещё через 15 лет? Ну просто пересчитав указанные объёмы вставки.

    В полновесном MVCC транзакционнике PostgreSQL очень маленькие строки держать несколько дорого именно по месту, заголовок строки большой.

    3 колонки id, factor_id, parcel_id

    24 да 3*8 байт если эти поля считать bigint'ами, да на лярд записей... порядка 25гб плюс-минус. Фигня вопрос вообще-то. У вас проблема-то есть? Или просто руки чешутся?
    Ответ написан
    4 комментария
  • Как распределить логи звонков по БД?

    Melkij
    @Melkij
    PostgreSQL DBA
    Два вопроса:
    - сначала решите зачем вам эти данные, как и зачем их отображать. Только потом думайте над хранением. Потому что от задач зависит что именно вам надо хранить.
    - сколько миллионов звонков у вас в час чтобы думать над распределением записи?

    Партицировать по месяцам, впрочем, вероятно будет полезно. Удалять целиком партиции банально проще. Только именно партицировать штатными средствами СУБД, а не грабли какие-то странные выдумывать.
    Ответ написан
  • Зачем делают ID в формате sha1?

    Melkij
    @Melkij
    PostgreSQL DBA
    Чтобы:
    - без особой пользы в разы увеличить объём хранимых данных. Тем более если использовать строки.
    - постараться запутать планировщик базы
    - дополнительно увеличить стоимость записи индексов (значения случайны = значения пишутся в случайные места дерева, вы постоянно "пачкаете" разные страницы)

    Если это ключ партицирования - да, встречается такая схема партицирования. Но если это ключ партицирования - то вы бы и так уже знали почему используется не число.
    Ответ написан
  • Можно ли гарантированно записать информацию в две базы данных?

    Melkij
    @Melkij
    PostgreSQL DBA
    отключение света или kill процесса,

    Отдельно обращаю пристальное внимание на настройки редиса. Он не запишет данные с настройкой fsync по-умолчанию. Дефолтный fsync для AOF режима лога записи у него - раз в секунду. То есть все данные до секунды работы длительности вы можете потерять при крахе ОС.

    Redis не поддерживает протокол двухфазного коммита. И вы не можете сделать durable fsync в два места атомарно.
    Поэтому просто это никак не сделать.
    Что сделать можно - переделать логику, чтобы одна из баз могла при аварии привести данные в консистентный вид используя данные ведущей базы.
    Ответ написан
    Комментировать
  • Pg_basebackup, зависит ли скорость копирования от типа данных преобладающих в БД и можно ли как-то увеличить скорость копирования средствами postgres?

    Melkij
    @Melkij
    PostgreSQL DBA
    basebackup - это буквально копирование почти всего из PGDATA тупо на уровне файликов.
    Строго в один поток. (ну, на самом деле в отдельном потоке walreceiver ещё если wal method выставлен stream)

    Смотрите внимательнее куда упираетесь. Диск на чтение откуда снимаете? Диск куда пишете? Сеть? Одно ядро CPU на базе с которой снимаете? На которую пишете?
    Несколько гигабит занять в общем-то не проблема.
    Ответ написан
  • Где найти книги по БД или SQL в которых подробно описаны транзации?

    Melkij
    @Melkij
    PostgreSQL DBA
    Подробно? Суровая книжка? Тогда вам путь вот сюда:
    Transactional Information Systems Theory, Algorithms, and the Practice of Concurrency Control and Recovery, Gerhard Weikum и Gottfried Vossen
    Ответ написан
  • Как организовать zerodowntime обновление СУБД?

    Melkij
    @Melkij
    PostgreSQL DBA
    Вы должны разрабатывать и деплоить приложение соответствующим образом. Так, чтобы старая версия приложения могла работать с новой версией схемы базы. Или наоборот, новая версия приложения могла работать со старой схемой базы.
    То есть удаление таблички: сначала деплоите приложение, которое уже не работает с этой таблицей, потом удаляете таблицу
    Новая табличка: сначала миграция, затем приложение
    Новое поле в таблице с default значением: сначала поле, затем приложение
    Новое поле без default: сначала новое поле с default null, затем релиз приложения которое обязано писать новое поле, но ещё не читать его (либо приводить null к нужному если это возможно на приложении), затем миграция с проставлением нужного значения (и, блин, не одним update по всей большой таблице), drop default, set not null, деплой приложения со всей логикой
    И так далее. Во время разработки думаем, а как, когда и в сколько итераций это можно будет задеплоить.

    Ну и, разумеется, DBA (или заменяющий его обязанности человек) думает над тем, как именно вносить нужную миграцию в базу
    Ответ написан
    Комментировать
  • А кто нибудь вообще работает с БД через консоль?

    Melkij
    @Melkij
    PostgreSQL DBA
    Работаем. Постоянно. У меня не установлено ни одного GUI к какой-либо базе

    В psql вывод большого числа строк решается штатным \pset pager {on,off,always}, большое число столбцов обычно удобнее в развёрнутом виде (\x) смотреть.
    Или взять less в качестве PAGER и получить скролл таблицы и горизонтальный и вертикальный:
    export PAGER='/usr/bin/less -S'
    psql


    Для клиента mysql помню только развёрнутый вывод \G после запроса:
    mysql> select * from users \G
    *************************** 1. row ***************************
            id: 104
          name: NULL
        gender: 0
    birth_date: 0
         phone: NULL
    1 row in set (0.00 sec)

    По клиенту к ораклу ничего не скажу, не видел.
    Ответ написан
    1 комментарий
  • Какую базу данных посоветуете для высокой согласованности между узлами CP в рамках CAP теоремы?

    Melkij
    @Melkij
    PostgreSQL DBA
    чтобы они были согласованные

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

    У пользователя 100 рублей на счету. У вас упала сеть между серверами баз.
    Пользователь хочет потратить 100 рублей.
    Что дальше?
    - запрещаем тратить пока не починим - вот это CP система. Мы в readonly, но все данные корректны, к какой базе бы не обратились. Синхронная репликация в основном
    - разрешаем потратить только на одной базе, вторая - readonly и соответственно может показывать отстающие данные. Но работает. Это любая СУБД умеющая master-slave репликацию. Реплика догонит состояние мастера непротиворечиво и самостоятельно когда почините сеть
    - разрешаем запись на обоих серверах. Пользователь нажал "купить" дважды, запросы случайно попали на разные сервера. Сеть починили - как соединять данные? Две покупки и -100 на счету? Какая-то одна покупка? Как это решать автоматически, да ещё на уровне СУБД, а не бизнес-логики?
    Ответ написан
    1 комментарий
  • Что программно представляет собой реляционная база данных?

    Melkij
    @Melkij
    PostgreSQL DBA
    Есть фундаментальный труд Transactional Information Systems. Theory, Algorithms, and the Practice of Concurrency Control and Recovery авторства Gerhard Weikum и Gottfried Vossen.

    Ведь не проблема читать-писать файлы. Проблема - как это делать корректно в условиях конкурентного доступа, как обеспечивать восстановление после аварий, как обеспечивать ACID. В этой книге как раз вся сопутствующая теория.
    Ответ написан
    2 комментария
  • Есть ли БД на видеокартах?

    Melkij
    @Melkij
    PostgreSQL DBA
    Памяти у видеокарт мало для inmemory. И это не самостоятельное устройство, нужны инструкции от CPU что делать.
    А как глупая числодробилка - есть например для того же postgresql модуль, который может посчитать чего-нибудь большое на GPU вместо CPU, например тот же hash join.
    Ответ написан
    Комментировать
  • Как правильно спроектировать доступ к БД?

    Melkij
    @Melkij
    PostgreSQL DBA
    Смотрите в разделы транзакционной обработки данных; транзакции и изоляция транзакций. По этой теме книги пишут вот уже полвека минимум.
    Коллизии конечно могут быть если об этом не думать во время разработки. Жертвовать конкурентностью и принудительно выполнять задачи в один поток - да, бывает и такое.
    Ответ написан
    1 комментарий
  • Составной индекс и селективность его столбцов?

    Melkij
    @Melkij
    PostgreSQL DBA
    Составной индекс b типа сравнивается кортежами, то бишь порядок определения индекса имеет значение

    Зависит от алгоритма. Справедливо для btree, может быть полностью лишено смысла для других типов. Например, если СУБД будет строить ключ для hash-индекса от конкатенации полей индекса - (a,b) ничем не будет отличаться от (b,a).

    лучше определять b индекс для столбцов с высокой селективностью

    Не имеет важного значения.
    Значение имеет под какие запросы индексы делаем. btree (a,b) не может нормально обслуживать where b = value and a > value, для этого запроса куда осмысленнее (b,a)
    Если у вас запрос where a = const and b = const, то btree индексы (a,b) и (b,a) будут равнозначны.

    Если у вас индекс с крайне селективным timestamp на первом месте - то что вы с ним делать-то будете? Строгое сравнение таймштампа случай крайне редкий, а на любой запрос диапазона эффективность последующих полей падает катастрофично и большинство СУБД их вовсе не используют. В основном используют только если получается взять индекс как покрывающий.

    имеется два столбца в некоторой абстрактной таблице: x - внешний ключ, y - datetime

    Варианты если вы попробуете сделать только btree(y,x) индекс:
    - СУБД вовсе откажется делать FK т.к. нет подходящего индекса для проверки FK
    - СУБД неявно этот индекс создаст при добавлении FK
    - СУБД позволит существовать FK без индекса, но соответственно fullscan всей таблицы на каждую проверку консистентности по этому FK (возможно по отдельному сканированию на каждую строку, которая вызвала проверку целостности ключа)
    Ответ написан
    2 комментария
  • Современные инструменты для анализа sql запросов, какие они ( бренды)?

    Melkij
    @Melkij
    PostgreSQL DBA
    Касательно postgresql:
    Анализ конкретного запроса - explain (analyze,buffers) плюс немного знаний какие цифры что значат. Порой https://explain.depesz.com/ используется для визуализации цифр.
    Анализ нагрузки от запросов суммарно - contrib pg_stat_statements плюс любые какие вам нравятся выборки по полученной вьюшке. Например, топ запросов по времени выполнения, или какие запросы больше всего читают данных или какие пишут временные файлы - счётчиков для этого уже достаточно.
    Сторонние утилиты не скажут чего-то, что не скажет сама база.

    Касательно других баз - смотрите другие базы. explain есть наверное у всех, и точно у всех есть какие-то нативные метрики для запросов.
    Ответ написан
    2 комментария