Найти в Дзене

Отличия Materialized View от View от Table в базах данных

Оглавление

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

1. Определение

  • Таблица — это базовая структура для хранения данных в реляционной базе данных. Таблица содержит строки и столбцы, где каждый столбец имеет определённый тип данных, а каждая строка представляет собой запись.
  • Материализованное представление (Materialized View) — это объект базы данных, который хранит результат выполнения запроса (обычно SELECT) на диске, сохраняя его в виде таблицы. Основное назначение — кэширование и ускорение доступа к часто используемым и сложным запросам. Оно хранит результаты запроса и может обновляться по расписанию или вручную.
  • Представление (View): Виртуальная таблица, которая является результатом выполнения SQL-запроса. Данные в представлении не хранятся, и запрос выполняется каждый раз при обращении к представлению.

2. Хранение данных

  • Таблица: данные физически хранятся на диске в том виде, в котором они были вставлены (через INSERT, UPDATE и т.д.). Таблица — это основное хранилище данных.
  • Материализованное представление: данные также физически хранятся на диске, но они представляют результат выполнения запроса. Это как бы "снимок" данных из одной или нескольких таблиц, который хранится в виде таблицы.
  • Представление View: данные не хранятся физически. Каждый раз при обращении к представлению происходит выполнение запроса, который его определяет. По сути, представление — это всего лишь ссылка на SQL-запрос.

3. Обновление данных

  • Таблица: данные в таблице обновляются напрямую через команды вставки, обновления или удаления (INSERT, UPDATE, DELETE).
  • Материализованное представление: данные обновляются через команду REFRESH. Это может быть сделано вручную или по расписанию (например, через планировщик заданий базы данных). В некоторых СУБД (например, в Oracle) поддерживается механизм инкрементального обновления, при котором материализованное представление обновляется только изменёнными данными.
  • Представление: данные всегда актуальны, так как запрос выполняется каждый раз при обращении к представлению. Любые изменения в исходных таблицах автоматически отражаются в представлении.

4. Синхронизация с исходными данными

  • Таблица: данные в таблице всегда актуальны, поскольку это первичное хранилище данных.
  • Материализованное представление: данные могут быть неактуальными, если исходные таблицы обновились, а материализованное представление не было обновлено. До обновления (REFRESH) оно хранит устаревший результат запроса.
  • Представление: всегда показывает актуальные данные, поскольку представляет собой "живой" запрос к базовым таблицам.

5. Использование

  • Таблица: используется для хранения данных, которые будут многократно изменяться или запрашиваться напрямую. Это основной объект, в котором происходит непосредственная работа с данными.
  • Материализованное представление: используется для оптимизации производительности сложных или ресурсоёмких запросов. Вместо того, чтобы каждый раз выполнять тяжёлый запрос, база данных может просто обратиться к материализованному представлению, где уже хранится результат.
  • Представление: используется для упрощения сложных запросов, для объединения данных из нескольких таблиц, а также для создания абстракции над данными. Представления удобны для создания чистых и понятных интерфейсов для пользователей, скрывая сложные детали запросов.

6. Пример использования

  • Таблица: хранение данных о пользователях, заказах, товарах и т.д. Это основа всех транзакций в базе данных.
  • Материализованное представление: хранение результатов агрегированных данных, например, суммы продаж по регионам или времени. Это позволяет избегать многократного пересчёта сложных агрегатных функций при каждом запросе.

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

CREATE MATERIALIZED VIEW sales_summary AS
SELECT region, SUM(amount) AS total_sales
FROM sales
GROUP BY region;

Теперь, при запросе к sales_summary, данные будут читаться быстрее, так как результат уже сохранён на диске.

  • Представление: удобно использовать для создания абстракций над данными, например, для скрытия сложных вычислений, объединений таблиц, фильтрации данных.

Пример: у вас есть несколько таблиц с данными о пользователях, заказах и продуктах, и вы хотите создать простой интерфейс для просмотра всех активных пользователей:

CREATE VIEW active_users AS
SELECT id, name
FROM users
WHERE status = 'active';

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

7. Обновление при изменениях в связанных таблицах

  • Таблица: изменения в таблице происходят непосредственно, и результат этих изменений сразу отражён в данных.
  • Материализованное представление: не обновляется автоматически при изменении исходных данных (если не настроено автоматическое обновление). Чтобы отразить изменения в исходных таблицах, материализованное представление нужно вручную обновить.
REFRESH MATERIALIZED VIEW sales_summary;
  • Представление: любые изменения в исходных таблицах сразу же отражаются в представлении, так как оно всегда выполняет запрос к этим таблицам.

8. Пример запросов для создания:

  • Таблица:
  • Материализованное представление:
-2
  • Представление
-3

9. Производительность

  • Таблица: производительность запросов может быть оптимизирована с помощью индексов, но для сложных запросов, особенно при работе с большими объёмами данных, время обработки может быть значительным.
  • Материализованное представление: значительно ускоряет выполнение сложных запросов, поскольку хранит заранее вычисленные результаты. Однако обновление материализованного представления также может быть ресурсоёмким, особенно если данные часто изменяются.
  • Представление: каждый раз при обращении к представлению выполняется запрос. Если представление основано на сложных или ресурсоёмких запросах (например, с агрегатами, джойнами), это может негативно сказаться на производительности.

10. Автоматическое обновление

  • Таблица: обновляется напрямую через SQL-запросы (INSERT, UPDATE, DELETE).
  • Материализованное представление: в некоторых СУБД поддерживается автоматическое обновление с помощью триггеров или других механизмов, но чаще всего используется ручное обновление или обновление по расписанию. Некоторые СУБД (например, Oracle) поддерживают инкрементальное обновление, при котором обновляются только изменённые данные.
  • Представление: не требует обновления, так как всегда выполняет текущий запрос к данным.

Итог

  • Таблицы — это основное хранилище данных, которое используется для ввода, изменения и запроса информации.
  • Представление (View) - Виртуальная таблица, которая является результатом выполнения SQL-запроса.
  • Материализованное представление (Materialized View) - Это представление, данные которого предварительно рассчитаны и физически сохранены в базе данных.

-4

Еще немного про материализованные представления

Зачем нужны материализованные представления?

Материализованные представления полезны в сценариях, где выполнение сложных запросов занимает много времени. Они позволяют:

  • Сократить время выполнения запросов — материализованные представления хранят уже вычисленные данные, что устраняет необходимость перерасчёта каждый раз.
  • Оптимизировать аналитические задачи — особенно полезны в аналитике (OLAP), когда требуется часто выполнять отчёты на основе больших объёмов данных.
  • Уменьшить нагрузку на базу данных — вместо того, чтобы выполнять ресурсоёмкие запросы на живых данных, можно обращаться к предвычисленным данным.

Виды обновления материализованных представлений

1. Полное обновление (Complete Refresh)

  • Полное обновление полностью пересчитывает данные материализованного представления с нуля.
  • Используется, когда требуется гарантированно получить обновленную и актуальную информацию.
  • Пример команды обновления:
REFRESH MATERIALIZED VIEW total_orders_per_customer;

2. Инкрементальное обновление (Fast Refresh)

  • При инкрементальном обновлении обновляются только изменённые данные (например, обновляются только те строки, которые изменились с момента последнего обновления).
  • Для поддержки инкрементального обновления требуется, чтобы были созданы определённые индексы или триггеры, которые отслеживают изменения в исходных таблицах.

3. Автоматическое обновление (Automatic Refresh)

  • Материализованное представление может быть настроено для автоматического обновления через определённые интервалы времени или после изменений в исходных данных.
  • Пример создания автоматического обновления:
CREATE MATERIALIZED VIEW total_orders_per_customer
REFRESH FAST ON DEMAND
START WITH SYSDATE NEXT SYSDATE + 1/24;

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

Преимущества материализованных представлений

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

2. Снижение нагрузки на базу: Повторное выполнение одного и того же запроса заменяется доступом к уже сохранённым результатам, что снижает нагрузку на сервер.

3. Гибкость обновления: Возможность настраивать обновление данных в зависимости от нужд приложения (например, по расписанию или при изменениях в исходных таблицах).

Недостатки материализованных представлений

1. Затраты на хранение: Материализованные представления занимают физическое пространство в базе данных, так как данные сохраняются на диске.

2. Ожидание обновления: Данные в материализованном представлении могут быть не всегда актуальны. Необходимо продумывать политику обновления исходя из требований к актуальности данных.

3. Сложность поддержки: Поддержка инкрементальных обновлений требует дополнительной настройки (например, триггеров, индексов), что может усложнить администрирование.

Когда использовать материализованные представления?

Материализованные представления полезны в следующих сценариях:

  • Аналитические системы: Когда необходимо часто выполнять отчёты и запросы к большим объёмам данных.
  • Кэширование данных: В системах, где требуется кэшировать сложные запросы для быстрого доступа.
  • Приложения с высокой нагрузкой: В случаях, когда выполнение сложных запросов может замедлить работу системы.


Если Вам интересно, что еще можно найти на канале QA Helper, прочитайте статью: Вместо оглавления. Что вы найдете на канале QA Helper - справочник тестировщика?

Не забудьте подписаться на канал, чтобы не пропустить полезную информацию: QA Helper - справочник тестировщика

Пишите в комментариях какой пункт было бы интересно рассмотреть более подробно.

Обязательно прочитайте: Что должен знать и уметь тестировщик

Также будет интересно почитать: Вопросы которые задают на собеседовании тестировщикам

Наука
7 млн интересуются