Настоящий краудфандинг. Даешь сравнение двух СУБД!

25.03.23

База данных - Администрирование СУБД

Первый вариант сравнения двух СУБД. Каждый может внести правку и получить SM. Приветствуются конструктивные комментарии, начинающиеся словами "Автор ничего не понимает".

Настоящий краудфандинг. Даешь сравнение двух СУБД !

 

Предисловие

Как можно сравнить архитектуру MS SQL и PostgreSQL?. Постепенно пришло понимание, что такое сравнение можно создать коллективным трудом на нашей любимой площадке. Ниже первый вариант статьи. Всех желающих участвовать ожидает sm-вознаграждение. Предложения по статье присылайте в личку или в комментарии.

Правила разработки статьи

Максимально сокращаем текст, выбираем только существенные черты. Не используем копирование источников, пишем своими словами. Не обсуждаем архитектурные решения, которые:

  • применяются редко, опционально. Примером таких решений (на мой взгляд) могут быть buffer pool extension (ms), cache prewarm (pg), blockchain extension (pg).
  • недоступны типовыми средствами 1С. Например, платформа 1С не использует некоторые типы индексов

Если Вы не согласны – давайте обсудим.

Каждое утверждение оформляем в отдельный абзац, после которого указываем различия между СУБД и ссылки на первоисточники. Первоисточники – документация и блоги разработчиков. Без первоисточников статья не имеет ценности.

Соглашение о терминах и сокращениях

  • Диск = Энергонезависимая память (СХД, HHD, SSD, RAID)
  • Память = Оперативная память, RAM
  • PG= PostgreSql
  • MS = MS SQL
  • SR = SERIALIZABLE
  • RR = REPEATABLE READ
  • RC = READ COMMITTED
  • RCSI = READ COMMITTED SNAPSHOT ISOLATION
  • RUnC = READ UNCOMMITTED

Таблицы

[ Логические таблицы могут состоять из нескольких файлов. Файлы на физическом уровне состоят из страниц. Размер страницы обычно 8 кб. ]

[ PG Таблица содержит несколько версий данных, с указанием диапазона транзакций, в которых данные актуальны. ]

[ MS Файл данных имеет расширение mdf. 8 страниц объединяются в экстенты 64 кб, размер экстента должен совпадать с размером физической страницы диска. ]

Индексы

[ Один из типов – btree. Индекс физическом уровне держится в страницах. Нижние страницы указывают на содержимое таблицы, внутренние – на дочерние страницы. Из одной страницы может быть много ссылок. Кроме ссылок в страницах индекса содержатся ключи данных. Страницы индексов на диске должны располагаться удобно для последовательного чтения. Нарушение последовательности, вызванное добавлением страниц - внешняя фрагментация. Чрезмерное свободное место на странице - внутренняя фрагментация. При чтении из индекса, получаем упорядоченные данные. ]

MS Нижний слой кластерного индекса - исходная таблица. ]

[ PG Нижний слой кластерного индекса – указатели на исходную таблицу. Поскольку в таблице содержится несколько версий данных, для получения актуальной версии требуется дополнительная информация. ]

см. также https://its.1c.ru/db/metod8dev/content/1590/hdoc

Статистика

 [ Для выбора лучшего плана запроса используется дополнительная информация:

  • Гистограмма распределения количества строк по ключевым столбцам индекса. Обычно содержит 100-200 интервалов. Приблизительное количество строк в таблице.
  • Данные о зависимости между столбцами.
  • Данные о избирательности (плотности) индекса – количество различных значений.

Для временных таблиц обязательно создается временная статистика. При создании индекса статистика пересчитывается. Дефрагментация индекса не изменяет распределение данных. Обновление статистики может вызвать перекомпиляцию запросов. ]

MS На уровне базы данных предусмотрены параметры: AUTO_UPDATE_STATISTICS обновлять статистику перед запросом, при необходимости, в зависимости от количества (процента) измененных строк, количества строк в таблице. AUTO_UPDATE_STATISTICS_ASYNC запрос выполняется без обновления статистики, даже если статистика устарела, но СУБД пытается восстановить статистику перед следующим выполнением запроса. СУБД может создавать дополнительную статистику, если установлено AUTO_CREATE_STATISTICS.

Пересчет статистики выполняется по приблизительной схеме, если не указать FULLSCAN. Статистику можно обновлять после регламентных операций, связанных с изменением большого количества строк. Для просмотра DBCC SHOW_STATISTICS. ]

PG Значения статистики автоматически обновляются командами VACUUM, ANALYZE. Параметры обновления в файле postgresql.conf. Для просмотра pg_stats. ]

Буферный кеш

[ Чтобы уменьшить количество операций чтения-записи к диску, страницы СУБД предварительно считывают с диска в память, измененные (грязные) страницы записывают обратно, когда будет удобно. Физическим чтением называется считывание страниц с диска, логическим – чтение страниц буферного кеша. Если в кеше недостаточно места, (невостребованные) данные вытесняются, заменяются другими. Временные таблицы в буферном кеще не хранятся: их не нужно восстанавливать после сбоя. ]

[ MS Показатели представления sys.dm_os_performance_counters, perfmon.exe:

  • Коэффициент попадания в буферный кэш (Buffer cache hit ratio)
  • Ожидаемый срок жизни страницы (Page life expectancy) ]

[ PG Размер устанавливается параметром shared_buffers. Есть рекомендация выделять 1/4 памяти. Расширение для наблюдения: pg_buffercache]

 Контрольная точка

[ Процесс, записывающий все «грязные» страницы в базу данных. Необходим для целей восстановления. Когда все изменения содержатся в базе данных на диске - это более устойчивое положение. Процесс восстановления на основании контрольной точки запускается автоматически при старте СУБД, если начальное состояние не совпадает с контрольной точкой. Контрольная точка может выполняться по плану в зависимости от условий, при завершении работы СУБД или создании резервной копии, вручную. Длительные незафиксированные транзакции препятствуют созданию контрольных точек.

Условия создания контрольных точек отличаются в (pg) и (ms), аргументами могут быть: время между точками, количество «грязных» страниц в буфере, и т.д. ]

[ MS  Параметр, влияющий на расписание recovery interval. После MS2012 между двумя контрольными точками для уменьшения количества "грязных" страниц запускается "косвенная контрольная точка"]

[ PG Параметр, влияющий на расписание checkpoint_timeout. Между двумя контрольными точками для уменьшения количества "грязных" страниц запускается процесс bgwritter. Статистика работы в представлении pg_stat_bgwriter. Указание на последнюю контрольную точку хранится в файле $PGDATA/global/pg_control ]

Журнал ...

[ В терминах MS - журнал транзакций, в терминах PG - журнал предзаписи, WAL. Итак, «грязные» страницы обрабатываются в памяти и периодически записываются на диск. Если произойдет сбой в памяти, то может потеряться информация после контрольной точки. Чтобы избежать потери, перед записью в базу делаем «запасную» запись в журнал. Временные файлы и временные таблицы записывать в журнал нет смысла.

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

Журнал позволяет выполнять:

  • откат транзакций
  • восстановление незавершенных транзакций при запуске СУБД
  • восстановление состояния СУБД на момент
  • репликацию СУБД;

Сокращать журнал имеет смысл только после выполнения контрольной точки. ]

MS При модели восстановления SIMPLE журнал усекается автоматически при достижении контрольной точки, при модели восстановления FULL или BULK-logged после резервного копирования журнала. ]

[ PG Применяется несколько способов проверки записи WAL: при включенном или отключенном кеше диска, использовать для проверки одну из функций fdatasync, fsync, open. ]

 Уровни изоляции

[ Четыре уровня установлены стандартом SQL92, объявляются при начале транзакции СУБД командой SET TRANSACTION.

Уровень изоляции

Фантомное чтение

Неповторяющееся чтение

«Грязное» чтение

Потерянное обновление

SERIALIZABLE

+

+

+

+

REPEATABLE READ

-

+

+

+

READ COMMITTED

-

-

+

+

READ UNCOMMITTED

-

-

-

+

Подробнее об использовании блокировок платформой 1С смотрите Руководство разработчика пункт 9.3. Механизм управляемых блокировок, управление блокировками.

  • Потерянное обновление: при одновременном изменении остаются последние данные
  • Грязное чтение: чтение данных незавершенных транзакций
  • Неповторяющееся чтение: внутри транзакции, при повторном чтении данных получаются другие значения.
  • Фантомное чтение: Все существующие строки не могут быть изменены. Но добавляются новые строки, которые подходят под условие транзакции.

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

Serializable - Самый высокий уровень изолированности; транзакции полностью изолируются друг от друга. На этом уровне применяются блокировки диапазонов (предикатные блокировки), которых захватывают граничные значения. ]

[ MS RUnC Выполняется запросом с хинтом nolock ]

[ PG RUnC Невозможно стандартными средствами СУБД, только дополнительной утилитой]

[ MS RC Использует блокировки. Перед чтением строки устанавливается блокировка, после чтения – снимается. Возможно раньше окончания транзакции ]

[ MS RCSI Использует мультиверсионность. В транзакции, при первом обращении к данным, происходит снимок данных (Snapshot), который хранится в tempdb (до версии 19)]

[ PG RC Использует мультиверсионность. Все версии данных хранятся в таблицах. Каждая версия содержит интервал номеров транзакций, в которых она актуальна. Неактуальные версии данных очищаются в фоновом режиме заданием vacuum]

[ MS RR При изменении данных параллельными транзакциями происходит ошибка в транзакции, которая начинается последней. Блокировки в разделяющем режиме применяются ко всем данным, считываемым любой инструкцией транзакции, и сохраняются до её завершения. Это запрещает другим транзакциям изменять строки, которые были считаны незавершённой транзакцией. Однако другие транзакции могут вставлять новые строки, соответствующие условиям поиска инструкций, содержащихся в текущей транзакции ]

[ PG RR использует снимок на начало транзакции. более строгое, чем предусматривает стандарт. При изменении данных параллельными транзакциями происходит ошибка в транзакции, которая завершается последней. Допускается параллельная транзакция чтения. Применяются предикатные блокировки, которые могут сниматься после (!) окончания транзакции и укрупняться на уровень таблицы. ]

[ PG SR параллельные транзакции не допускаются. Применяются предикатные блокировки, которые могут быть сняты до или после (!!) транзакции. Блокировки можно видеть в pg_locks. Предикатные блокировки строк могут укрупняться в одну предикатную блокировку уровня таблицы из-за нехватки памяти. ]

Транзакции и блокировки

[ Транзакция - последовательность операторов DML со свойствами:

  • Atomicity — Атомарность
  • Consistency — Перевести базу данных из одного согласованного состояния в другое.
  • Isolation — Параллельные транзакции не должны оказывать влияния.
  • Durability — Стойкость (надежность диска)

Протокол 2PL: установка, снятие. В базовом протоколе используются два типа блокировок: Shared и Exclusive locks.

Неявные транзакции СУБД: создание индекса, реструктуризация базы. В терминах 1С неявные транзакции – например, запись объекта. При чтении объекта с табличной частью в режиме совместимости после 8.2.17 нет неявной транзакции (!).

Блокировка есть информация. При установке блокировки, СУБД проверяет наличие существующей блокировки.

Взаимоблокировки разрешаются фоновым заданием – монитор блокировок. В качестве жертвы взаимоблокировки может быть выбрана: транзакция откат которой потребует меньше всего затрат или по приоритетам или по времени. ]

[ MS  Информация о блокированных строках хранится в оперативной памяти. При большом количестве блокированных строк, для предотвращения большого расхода памяти, происходит укрупнение гранулярности (эскалация) блокировки. ]

[ PG Исключительная блокировка строк RC отражается как версия данных, на той же странице. Нет потребности в эскалации для экономии памяти. Для разделяемых блокировок применяются так называемые мультитранзакции (MultiXact). Это группа транзакций, которой присвоен отдельный номер. Предикатные блокировки в режиме RR могут использовать укрупнение. ]

См. также

Установка и примеры использования 1С:Исполнитель на РедОС

Администрирование СУБД Платформа 1С v8.3 Бесплатно (free)

Краткое описание шагов по установке, настройке и применению инструмента 1С:Исполнитель на операционной системе РедОС, а также по борьбе с некоторыми возникающими ошибками.

06.05.2024    459    artemusII    0    

1

Нестандартное решение пересчета итогов

Администрирование СУБД Платформа 1С v8.3 Бесплатно (free)

Статья для тех, кто столкнулся с необходимостью пересчета итогов для "больших таблиц" и нет возможности поставить на паузу ИБ для проведения работ.

25.04.2024    1616    virustam    28    

8

Идентификация пользователя не выполнена

Администрирование СУБД Платформа 1С v8.3 1С:Бухгалтерия 3.0 Россия Бесплатно (free)

Иногда в конфигурации 1С:Бухгалтерский учет v3.0 возникает ситуация, когда программа всем пользователям выдает предупреждение, что авторизация не выполнена и работа программы будет завершена. Данная инструкция позволяет решить возникшую проблему.

24.04.2024    548    Yan_Malyakov    0    

2

Устранение ошибки выполнения скрипта "Создать сервис RAGENT" в ЦКК

Администрирование СУБД Платформа 1С v8.3 Конфигурации 1cv8 Россия Бесплатно (free)

В статье показано, как устранить ошибку выполнения скрипта "Создать сервис RAGENT" в системах 1С:Центр контроля качества или в 1С:Центр автоматизации. Будет полезна администраторам ЦКК и ЦА, которые только начали знакомство с этими системами.

18.04.2024    396    artemusII    0    

7

Долгая реструктуризация, замеры времени и очистка Ветис. Розница 2.3

HighLoad оптимизация Администрирование СУБД Платформа 1С v8.3 1С:Розница 2 Розничная и сетевая торговля (FMCG) Россия Бесплатно (free)

При подготовке к обновлению возникли проблемы на стадии тестирования и исправления базы данных, также при создании файлов РИБ для магазинов.

16.04.2024    429    xKaskadx    4    

1

Установка и получение лицензии на базовую конфигурацию 1С на Mac OS

Администрирование СУБД Платформа 1С v8.3 Бесплатно (free)

Установить купленную базовую конфигурацию 1С и получить лицензию на MAC OS не так просто, как кажется на первый взгляд и как хотелось бы. Официально в системных требованиях на базовую конфигурации 1С пишет всякие виндовсы и пару-тройку линуксов. МакОс там нет. В статье расскажу, как все-таки поставить на Мак базовую конфигурацию 1С.

11.04.2024    454    pahmutov    0    

3

Установка тонкого клиента 1С на Rasbian (Raspberry Pi 5)

Администрирование СУБД Платформа 1С v8.3 Бесплатно (free)

После приобретения Raspberry Pi 5 решил проверить, есть ли возможность использования устройства для организации тонкого клиента. В результате столкнулся с особенностью установки 1С: Предприятие 8.3.23 на Raspbian, решением которой я хочу поделиться с сообществом.

07.04.2024    850    Bessome    4    

5

Порционный шринк базы

Администрирование СУБД Бесплатно (free)

Скрипт позволяет высвобождать место в операционную систему, занятое файлом базы MS SQL в итерациях с заданным количеством мегабайт

28.03.2024    1423    Garilia    3    

15