Транзакционные и отчетные базы данных - как? - PullRequest
8 голосов
/ 06 октября 2010

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

Зачастую рекомендуется придерживаться указаний о том, что вы никогда не должны запускать эти запросы из своей модели транзакционной БД, скорее, вам следует использовать денормализованную уплощенную модель, адаптированную для конкретных представлений пользовательского интерфейса или отчетов, что устраняет необходимость во многих объединениях. В этом сценарии дублирование данных не является проблемой.

Эта концепция имеет совершенный смысл, но то, что я редко вижу, когда эксперты делают эти заявления, - именно КАК реализовать это. Например, (и, откровенно говоря, я бы оценил пример использования любой платформы) в системе среднего размера, работающей на серверном сервере SQL, у вас есть нормализованная транзакционная модель. У вас также есть несколько отчетов и веб-сайт, который требует запросов. Итак, вы создаете базу данных «отчетности», которая выравнивает нормализованные данные. Как вы держите это в синхронизации? Доставка журнала транзакций? Если да, как вы преобразуете данные, чтобы они соответствовали модели отчетности?

Ответы [ 5 ]

3 голосов
/ 06 октября 2010

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

С сегодняшним оптимизатором в SQL Server, я думаю, что представление о том, что объединения в нормализованной базе данных «слишком дороги» для создания отчетов, несколько устарело. Наш дизайн полностью 3-й нормальной формы, несколько миллионов строк в наших основных таблицах, и у нас нет проблем с запуском любого из наших отчетов. Сказав это, если толчок наступит, вы могли бы создать несколько индексированных представлений на вашем сервере отчетов, чтобы выручить.

0 голосов
/ 06 октября 2010

Правильная индексация, покрытие индексов и переформатирование запросов, вероятно, могут принести вам много пользы.Однако, если вы уже это делаете, вы можете либо зеркально отразить базы данных, скопировать их, либо создать пакет etl и создать куб / ы служб анализа.

0 голосов
/ 06 октября 2010

Консервированный ответ :

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

Индексированные представления могут увеличить конфликт блокировок.

Это очень легко продемонстрировать.Создайте следующую таблицу:

CREATE TABLE dbo.ChildTable(ChildID INT NOT NULL 
  CONSTRAINT PK_ChildTable PRIMARY KEY,
  ParentID INT NOT NULL,
  Amount INT NOT NULL);
GO   

На одной вкладке в SSMS запустите этот скрипт:

BEGIN TRAN;
INSERT INTO dbo.ChildTable(ChildID, ParentID, Amount)
  VALUES(1,1,1); 

На другой вкладке запустите похожую:

BEGIN TRAN;
INSERT INTO dbo.ChildTable(ChildID, ParentID, Amount)
  VALUES(2,1,1);
ROLLBACK;

Обратите внимание, что обе вставки завершены, они не блокируют друг друга.Откатитесь на обе вкладки и создайте индексированное представление:

CREATE VIEW dbo.ChildTableTotals WITH SCHEMABINDING
AS
SELECT ParentID, 
  COUNT_BIG(*) AS ChildRowsPerParent, 
  SUM(Amount) AS SumAmount
FROM dbo.ChildTable
GROUP BY ParentID;
GO
CREATE UNIQUE CLUSTERED INDEX ChildTableTotals_CI 
  ON dbo.ChildTableTotals(ParentID);

Перезапустите две вставки.Обратите внимание, что второй не завершен;это заблокировано.Причина очень проста: первая вставка изменяет соответствующую запись в индексированном представлении, поэтому вставка получает и удерживает на нем блокировку.

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

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

Редактировать: пример может показаться надуманным, но проблема, которую он демонстрирует, очень реальна и очень распространена.Индексированные представления в средах OLTP имеют ограниченное использование, потому что они серьезно увеличивают конфликт блокировки и вызывают много взаимоблокировок.Весьма распространено, что кто-то создает их в OLTP, но в конце концов удаляет, потому что они создают больше проблем, чем решают.

Существует два распространенных способа демонстрации проблем, вызванных параллелизмом: мы либо пишем циклы, а затем запускаем ихнесколько соединений, или явно начать транзакции в двух или более соединений.Я призываю всех придумать более простой способ продемонстрировать эту проблему.

0 голосов
/ 06 октября 2010

Мы используем репликацию транзакций в другую базу данных.

Мы фильтруем данные, чтобы получить только те данные, которые нам нужны, в нашей базе данных репликации.

Мы также выбираем только те столбцы, которые нам нужны, поэтомутаблицы «меньше».

Затем мы объединяем данные в базе данных репликации либо через представления, либо создаем триггеры для добавления данных из одной таблицы в другую.

0 голосов
/ 06 октября 2010

Краткий ответ: попробуйте поработать с индексированными представлениями . Существует ряд ограничений на базовые таблицы, но вы получаете синхронизацию "из коробки".

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