Представления и их обновление — различия между версиями
Cuciev (обсуждение | вклад) (Обновления и SQL) |
Cuciev (обсуждение | вклад) (Материализованные представления) |
||
Строка 1: | Строка 1: | ||
{{В разработке}} | {{В разработке}} | ||
+ | = Представления = | ||
{{Определение | {{Определение | ||
− | |definition='''Представление''' {{---}} механизм, представляющий из себя именованный запрос. В момент каждого обращения к представлению, исполняется соответствующий ему запрос. При этом, представления могут использоваться как таблицы, на пример, в <code>select ... from</code>. | + | |id=def1 |
+ | |neat = 1 | ||
+ | |definition='''Представление''' {{---}} механизм, представляющий из себя именованный запрос. В момент каждого обращения к представлению, исполняется соответствующий ему SQL-запрос. При этом, представления могут использоваться как таблицы, на пример, в <code>select ... from</code>. | ||
}} | }} | ||
Наиболее распространенные случаи применения: | Наиболее распространенные случаи применения: | ||
Строка 42: | Строка 45: | ||
==== Проекция ==== | ==== Проекция ==== | ||
− | В [[Реляционная_алгебра: унарные операции | проекции]] при вставки кортежа имеется набор атрибутов, на который значение проецируется; его необходимо дополнить значениями атрибутов, которые при проекции были | + | В [[Реляционная_алгебра: унарные операции | проекции]] при вставки кортежа имеется набор атрибутов, на который значение проецируется; его необходимо дополнить значениями атрибутов, которые при проекции были отброшены: для этого выбираются значения по умолчанию, с которыми кортеж вставляется. |
При удалении данных из проекции, необходимо удалить все соответствующие кортежи из базового отношения: если удалить лишь один из нескольких, в проекции этот кортеж останется. | При удалении данных из проекции, необходимо удалить все соответствующие кортежи из базового отношения: если удалить лишь один из нескольких, в проекции этот кортеж останется. | ||
Строка 75: | Строка 78: | ||
* один-к-одному: вставка и удаление производятся как для левой, так и для правой части; | * один-к-одному: вставка и удаление производятся как для левой, так и для правой части; | ||
* один-ко-многим: кортеж вставляется в часть «многие», а в части «один» соответствующие данные уже могут присутствовать; | * один-ко-многим: кортеж вставляется в часть «многие», а в части «один» соответствующие данные уже могут присутствовать; | ||
− | * многие-ко-многим: с точки зрения реальных баз данных, данное отношение [[Преобразование_модели_сущность-связь_в_физическую_модель#.D0.A1.D0.B2.D1.8F.D0.B7.D0.B8_.D0.BC.D0.BD.D0.BE.D0.B3.D0.B8.D0.B5-.D0.BA.D0.BE-.D0.BC.D0.BD.D0.BE.D0.B3.D0.B8.D0.BC_2 | преобразуется]]в join-table, имеющую отношение «один-ко-многим» с обеих из своих сторон; | + | * многие-ко-многим: с точки зрения реальных баз данных, данное отношение [[Преобразование_модели_сущность-связь_в_физическую_модель#.D0.A1.D0.B2.D1.8F.D0.B7.D0.B8_.D0.BC.D0.BD.D0.BE.D0.B3.D0.B8.D0.B5-.D0.BA.D0.BE-.D0.BC.D0.BD.D0.BE.D0.B3.D0.B8.D0.BC_2 | преобразуется]] в join-table, имеющую отношение «один-ко-многим» с обеих из своих сторон; |
=== Обновления и SQL === | === Обновления и SQL === | ||
Строка 89: | Строка 92: | ||
== Материализованные представления == | == Материализованные представления == | ||
− | === | + | {{Определение |
− | + | |id=def2 | |
+ | |definition='''Материализованное представление''' (МП) {{---}} в отличие от [[#def1 | представления]], является «слепком» данных на определенный момент времени, который хранящимся физически в виде отдельной таблицы и не изменяется при изменении базовой версии. | ||
+ | }} | ||
+ | Преимущества: | ||
+ | * быстрота выборки: МП может быть сформировано на основе сложного подзапроса, и, из-за того, что данные будут сохранены, этот запрос не будет пересчитываться повторно; | ||
+ | * возможность «фиксации» данных; | ||
+ | |||
+ | Недостатки: | ||
+ | * для работы с актуальными данными, появляется необходимость обновления МП; | ||
+ | * физически хранимые данные могут занимать большие объемы памяти; | ||
+ | |||
+ | === Синтаксис === | ||
+ | <font color=blue>create materialized view <font color=red>имя</font> | ||
+ | <font color=red>[</font> | ||
+ | <font color=blue> refresh <font color=red>[{<font color=blue>fast<font color=grey>|<font color=blue>complete<font color=red>}] [<font color=blue>on <font color=red>{<font color=blue>commit<font color=grey>|<font color=blue>demand<font color=red>}]</font> | ||
+ | <font color=red> [<font color=blue>start with <font color=red>время] [<font color=blue>next <font color=red>время] <font color=green> -- в некоторых БД</font> | ||
+ | <font color=red>]</font> | ||
+ | <font color=blue>as <font color=red>запрос<font color = black></font> | ||
+ | |||
+ | Режимы обновления: | ||
+ | * <code>fast</code>: инкрементальные обновления в зависимости того, какие фрагменты данных были изменены в базовых таблицах этого отношения. Не рекомендуется использовать в условиях частого обновления исходной таблицы, для некоторых запросов данный режим может не поддерживаться; | ||
+ | * <code>complete</code>: полный пересчет; | ||
+ | |||
+ | Частота обновлений: | ||
+ | * <code>commit</code>: при завершении любой операции; | ||
+ | * <code>demand</code>: при вызове команды <code>refresh materialized view</code>; | ||
+ | |||
+ | <font color=blue>refresh materialized view <font color=red>имя</font> | ||
+ | |||
+ | ==== Пример ==== | ||
+ | <font color = green> -- МП для подсчета текущих средних баллов студентов, обновляемое раз в день:</font> | ||
+ | <font color=blue>create materialized view <font color=black>AveragePoints</font> | ||
+ | <font color=blue>refresh next <font color=black>dateadd(day, now(), 1)</font> | ||
+ | <font color=blue>as select <font color=black>SId, avg(Points) <font color=blue>from <font color=black>Points <font color=blue>group by <font color=black>SId</font> |
Версия 04:37, 20 декабря 2021
Содержание
Представления
select ... from
.Наиболее распространенные случаи применения:
- Макросы — выделение общей части нескольких запросов;
- Независимость от данных — использование представлений вместо декомпозированной таблицы для сохранения механизма взаимодействия для чтения со стороны клиента;
- Сокрытие данных;
Синтаксис
create view имя as запрос -- объявление представления drop view имя -- удаление представления по его имени
Примеры
-- Представление для подсчета текущих средних баллов студентов: create view AveragePoints(SId, AvgPoints) as select SId, avg(Points) from Points
-- Представление для получения имени и фамилии студента -- с текущим количеством баллов, полученных им на каждом курсе: create view StudentCourse(FN, LN, N, P) as select s.FirstName, s.LastName, c.Name, p.Points from Students s natural join Points p natural join Courses c
Данный пример, в частности, демонстрирует удобство использования представлений — без их использования указанное выше выражение с тремя join
пришлось бы писать каждый раз. Также, если бы таблицы и являлись бы результатом декомпозиции таблицы , создание данного представления позволяет избежать необходимости изменять код взаимодействия с ней.
Обновление представлений
Рассмотрим пример: в результате декомпозиции имевшейся таблицы
Так же существует необходимость использовать не только операции чтения, но и записи, такие, чтобы:
- их результаты отражались и ;
- вставка была взаимообратна удалению;
- делать запись как если бы представление было таблицей;
Будем рассматривать обновления, как предварительное удаление (без проверки целостности) и последующую вставку обновленных данных.
Унарные операции
Фильтрация
Вставка кортежа в результат фильтрации возможна только при выполнении им условия фильтра. В противном случае такая строка не окажется в результате, так как будет отфильтрована: она будет вставлена в базовую таблицу, но не появится в представлении.
выполнения операцииЕсли кортеж удовлетворяет условию, данные можно как вставить, так и удалить.
Проекция
В проекции при вставки кортежа имеется набор атрибутов, на который значение проецируется; его необходимо дополнить значениями атрибутов, которые при проекции были отброшены: для этого выбираются значения по умолчанию, с которыми кортеж вставляется.
При удалении данных из проекции, необходимо удалить все соответствующие кортежи из базового отношения: если удалить лишь один из нескольких, в проекции этот кортеж останется.
Переименование
Для выполнения вставки, происходит переименование атрибутов в исходном кортеже, после чего он вставляется.
При удалении соответствующий кортеж удаляется.
Множественные операции
Пересечение
Для пересечения вставка кортежа выполняется как в , так и в . Так как предикатом пересечения является конъюнкция предикатов двух отношений, их проверка для кортежа не производится - в противном случае, кортеж не появится в ответе.
Аналогично, для удаления, кортеж должен быть удален из обоих отношений.
Объединение
Отсюда — алгоритм вставки для объединения : для каждого из отношений проверить соответствие кортежа предикатам каждой из сторон; в случае удовлетворения, вставить в соответствующее отношение. Если кортеж удовлетворяет обоим предикатам, он должен появиться и слева, и справа
При удалении кортеж удаляется как из
, так и из .Разность
Для разности вставка производится в .
Соединения
При вставке кортежа в естественное соединение часть его атрибутов, соответствующих , при удовлетворении предикату, вставляются в него, аналогично для .
Таким же образом, при удалении, из каждой из частей удаляются соответствующие атрибуты кортежа.
Алгоритмы вставки и удаления базируются на ограничениях целостности:
- один-к-одному: вставка и удаление производятся как для левой, так и для правой части;
- один-ко-многим: кортеж вставляется в часть «многие», а в части «один» соответствующие данные уже могут присутствовать;
- многие-ко-многим: с точки зрения реальных баз данных, данное отношение преобразуется в join-table, имеющую отношение «один-ко-многим» с обеих из своих сторон;
Обновления и SQL
С точки зрения SQL:
- Унарные операции:
- обновляемые;
- Множественные операции:
- необновляемые, несмотря на теоретическую возможность для обновления и пересечения и, с определенными ограничениями, для разности;
- Соединения
- один-к-одному — обновляемые;
- один-ко-многим — обновляемые только со стороны «многие»;
- многие-ко-многим — необновляемые (там, где поддерживаются);
Материализованные представления
Определение: |
Материализованное представление (МП) — в отличие от представления, является «слепком» данных на определенный момент времени, который хранящимся физически в виде отдельной таблицы и не изменяется при изменении базовой версии. |
Преимущества:
- быстрота выборки: МП может быть сформировано на основе сложного подзапроса, и, из-за того, что данные будут сохранены, этот запрос не будет пересчитываться повторно;
- возможность «фиксации» данных;
Недостатки:
- для работы с актуальными данными, появляется необходимость обновления МП;
- физически хранимые данные могут занимать большие объемы памяти;
Синтаксис
create materialized view имя [ refresh [{fast|complete}] [on {commit|demand}] [start with время] [next время] -- в некоторых БД ] as запрос
Режимы обновления:
-
fast
: инкрементальные обновления в зависимости того, какие фрагменты данных были изменены в базовых таблицах этого отношения. Не рекомендуется использовать в условиях частого обновления исходной таблицы, для некоторых запросов данный режим может не поддерживаться; -
complete
: полный пересчет;
Частота обновлений:
-
commit
: при завершении любой операции; -
demand
: при вызове командыrefresh materialized view
;
refresh materialized view имя
Пример
-- МП для подсчета текущих средних баллов студентов, обновляемое раз в день: create materialized view AveragePoints refresh next dateadd(day, now(), 1) as select SId, avg(Points) from Points group by SId