Ответы пользователя по тегу Базы данных
  • Где и как хранить таблицу на 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гб плюс-минус. Фигня вопрос вообще-то. У вас проблема-то есть? Или просто руки чешутся?
    Ответ написан
  • Как распределить логи звонков по БД?

    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
    Ответ написан
  • Что если int PK равен 0?

    Melkij
    @Melkij
    PostgreSQL DBA
    Да хоть с INT_MIN начинать, счётчику без разницы тикать от 0, от 1, или от -2147483648.
    Единица просто дефолтное стартовое значение в большинстве реализаций (мне не известны примеры такого, но они возможны).
    Ответ написан
  • Как организовать 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)

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

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

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

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

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

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

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

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

    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 (возможно по отдельному сканированию на каждую строку, которая вызвала проверку целостности ключа)
    Ответ написан
  • Современные инструменты для анализа sql запросов, какие они ( бренды)?

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

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

    Melkij
    @Melkij
    PostgreSQL DBA
    Судя по расширениям - это куски mysql.
    Только запросами к запущенному серверу mysql и взаимодействовать. Клиент выберите любой, их много
    Ответ написан
  • Как перенести данные одного кластера postgres в другой?

    Melkij
    @Melkij
    PostgreSQL DBA
    Минорные релизы именно так и ставятся: обновляются выполняемые бинарники и рестартовать базу в том же самом datadir.
    О чём есть замечание в каждых release notes: https://www.postgresql.org/docs/9.6/static/release...
    A dump/restore is not required for those running 9.6.X.

    release notes стоит поглядеть для всех пропущенных апдейтов, могут быть важные замечания для обновления.

    Кстати, обратите внимание, что 9.6.9 уже вышел и обновляться стоит именно на него.
    Ответ написан
  • Как переписать данную строку при портировании с MySQL на PostgreSQL?

    Melkij
    @Melkij
    PostgreSQL DBA
    В postgresql все текстовые типы следуют кодировке базы. case insensitive utf8 в pg не предусмотрено.
    Поэтому если у вас база в utf8 - то "STEM" varchar(50) not null
    Если база не в utf8 - не надо так делать.
    Ответ написан
  • Как устроены базы данных?

    Melkij
    @Melkij
    PostgreSQL DBA
    4+32*2+32*2 = 132

    Мне даже интересно, с чего вы придумали умножить именно на 2. Я честно не знаю распространённых кодировок фиксированной двухбайтной ширины. Обычно речь или про ворох однобайтовых или кодировки переменной длины.

    Поиск по смещению в датафайле - да, применяется. Но не имеет в общем случае ровно ничего общего со структурой таблицы уровня SQL.

    Например, краткий взгляд на internals postgresql: momjian.us/main/writings/pgsql/internalpics.pdf
    Ответ написан
  • Как отслеживать изменения в СУБД при конкурентной записи?

    Melkij
    @Melkij
    PostgreSQL DBA
    Возьмите pgq и пишите в очередь перед коммитом как найти нужные данные. Или триггером сразу при записи в таблицы шлите сообщения через pgq.
    При экспорте соответственно читаете сообщения из pgq. Всё.

    Или напишите или возьмите какой-нибудь готовый logical decoding. Сможете читать вообще поток репликации

    В общем случае в общем-то нужна всё равно очередь. Из транзакции в таблички очереди пишете метки какие данные изменились, читатель читает эту метки и получает все изменения независимо от времени коммита.
    Ответ написан