- •Часть 5
- •Глава 17 Представления
- •17.1. Введение
- •17.2. Для чего нужны представления
- •17.3. Определение данных
- •17.4. Манипуляции с данными: операции выборки
- •17.5. Манипуляции с данными: операции обновления
- •17.6. Обновление операций объединения, пересечения и вычитания
- •Объединение
- •Пересечение
- •17.7. Обновление представлений других видов
- •17.8. Снимки
- •17.9. Поддержка sql
- •17.10. Резюме
17.10. Резюме
Представление — это именованное реляционное выражение. Представления также называют именованными виртуальными отношениями (или переменными). Операции на представлениях обычно реализуются с помощью процесса подстановки, который состоит в замене имени представления выражением, определяющим представление. Такой процесс подстановки основан на свойстве замкнутости. Для операций выборки процесс подстановки корректно выполняется в ста процентах случаев (по крайней мере теоретически, но не обязательно на практике). Для операций обновления процесс подстановки корректно выполняется, только если представление является сохраняющим информацию (опять же теоретически, но не обязательно на практике).
В этой главе рассматривался обширный набор принципов, которые должны управлять процессом проектирования любого систематического механизма обновления представлений. Наиболее важным из них является принцип, гласящий, что предикат данного отношения (в частности, данного представления) служит критерием применимости операции обновления к данному отношению. Здесь также рассматривался механизм обновления, который на самом деле соответствует изложенным принципам. В частности, были изложены правила обновления представлений, определенных с помощью операций объединения, пересечения, вычитания, выборки, проекции, соединения и расширения. Кроме того, кратко рассматривались правила обновления представлений, определенных с помощью операций декартова произведения, 6-соединения, переименования и деления.
Также была затронута проблема логической независимости данных. Существует два аспекта такой независимости: аспект роста и аспект реструктуризации. Оба аспекта очень важны (но представления можно применять только в связи со вторым аспектом). Среди других преимуществ представлений можно отметить: способность представлений скрывать данные и, следовательно, обеспечивать некоторый уровень защиты, а также способность облегчать жизнь пользователей благодаря различным "макровозможностям".
Также здесь приведено обсуждение работы со снимками. И, наконец, кратко описаны относящиеся к теме аспекты стандарта SQL.
Осталось обсудить одно утверждение, которое почти всем понятно, но крайне редко оценивается по достоинству. На это утверждение следует обратить особое внимание, так как оно придает дополнительную поддержку изложенному здесь подходу к решению проблемы обновления представлений. Вот это утверждение:
Для любой базы данных выбор, какие отношения должны быть базовыми, а какие представлениями, выполняется достаточно произвольно.
В случае отношения с информацией о поставщиках, например, можно сделать хорошо знакомое отношение S базовым и затем определить две проекции — SNC (на атрибутах S#, SNAME и CITY) и ST (на атрибутах S# и STATUS) — как представления. Или можно создать два базовых отношения, а затем определить представление S (как соединение SNC и ST). Суть в том, что, конечно, обновляемость выбранной базы данных не должна зависеть от вашего решения, какие отношения представлять в виде базовых, а какие — в виде представлений. В нашем примере обновляемость отношения S не должна зависеть от того, является ли S базовым отношением или представлением.
Упражнения
17.1. Создайте на базе реляционного исчисления аналоги алгебраических определений представлений, показанных в разделе 17.3.
17.2. Создайте представление, содержащее номера поставщиков и номера деталей для поставщиков и деталей, которые не совмещены в одном городе.
17.3. Создайте представление, содержащее кортежи поставщиков, которые находятся в Лондоне.
17.4. В базе данных поставщиков, деталей и проектов для отношения SPJ определите представление SP, аналогичное отношению SP из базы данных поставщиков и деталей.
17.5. В базе данных поставщиков, деталей и проектов создайте представление с атрибутами номера проекта и названия города, состоящее из всех проектов, для которых поставщиком является поставщик S1 и используются детали Р1.
17.6. Рассмотрите представление, определенное с помощью следующего выражения:
CREATE VIEW HEAVYWEIGHTS AS
( ( ( P RENAME WEIGHT AS WT, COLOR AS COL ) )
WHERE WT > 14 ) [ P#, WT, COL ] ;
Укажите операции, которые будут реально выполнены (преобразованная форма) для каждого из перечисленных ниже случаев:
а) ТА := HEAVYWEIGHT WHERE COL = 'Green' ;
б) ТВ := ( EXTEND HEAVYWEIGHTS ADD WТ + 5 AS WTP ) [ P#, WTP ] ;
в) UPDATE HEAVYWEIGHTS WHERE WT 18 COL := 'White' ;
г) DELETE HEAVYWEIGHTS WHERE WT < 10 ;
д) INSERT ( ( P#:'P99', WT:12, COL:'Purple' ) )
INTO HEAVYWEIGHTS ;
17.7. Предположим, приведенное выше определение представления HEAVYWEIGHTS изменено следующим образом:
CREATE VIEW HEAVYWEIGHTS AS
( ( ( EXTEND P ADD WEIGHT * 454 AS WT ) RENAME COLOR AS COL ) WHERE WT > 14 ) [ P#, WT, COL ] ;
Теперь выполните задание упр. 17.6.
17.8. В главе 5 упоминалось, что иногда для представлений желательно объявлять потенциальные ключи (или первичный ключ), т.е. включать оператор candidate или primary key в выражение create view. Почему желательно иметь такую возможность?
17.9. Какие расширения системного каталога (описывался в главах 3 и 4), необходимы для поддержки представлений? Что можно сказать по поводу снимков?
17.10. Предположим, что данное базовое отношение R заменено двумя выборками А и В, такими, что объединение A union В всегда равно R, а пересечение A intersect В всегда пустое. Достижима ли логическая независимость данных?
17.11. а) Пересечение A intersect В эквивалентно соединению A join В (соединение один-к-одному, но это не совсем так, потому что в А могут существовать кортежи, для которых в В не существует дополняющего кортежа, и наоборот). Совместимы ли изложенные в этой главе правила обновления пересечений и соединений с подобной эквивалентностью?
б) Пересечение A intersect В также эквивалентно вычитанию A minus (A minus В) и вычитанию В minus (В minus А). Совместимы ли изложенные в этой главе правила обновления пересечений и вычитаний с подобной эквивалентностью?
17.12. Один из принципов, описанных в этой главе, состоит в том, что операции INSERT И DELETE по возможности должны быть противоположными. Удовлетворяют ли этот принцип правила обновления объединений, вычитаний и пересечений?
17.13. В этой главе (в процессе обсуждения логической независимости данных) обсуждалась возможность реструктуризации базы данных поставщиков и деталей посредством замены базового отношения S на две проекции этого отношения SNC и ST. Также отмечалось, что подобные реструктуризации не всегда тривиальны. Продумайте выводы.
17.14. Исследуйте любое SQL-приложение: а) можно ли в этом приложении найти примеры операций выборки на представлениях, завершившихся неудачей; б) каковы правила относительно обновляемости представлений в этом приложении (возможно, эти правила не такие строгие по сравнению с изложенными в этой главе).
Список литературы
17.1. Adiba M.E., Lindsay B.G. Database Snapshots // IBM Research Report RJ2772. — 1980.
В работе представлена концепция снимков, а также изложена семантика и реализация. Относительно реализации следует заметить, что внутри системы можно использовать различные типы "дифференциальных обновлений" — системе не обязательно выполнять в полном объеме исходный запрос за полное время вычисления этого запроса.
17.2. Buff H.W. Why Codd's Rule № 6 Must Be Reformulated // ACM SIGMOD. — 1988. — 17, № 4.
В 1985 году Кодд (Codd) опубликовал набор из двенадцати правил, которые используются как "часть теста для определения, является ли продукт, объявленный как полностью реляционный, на самом деле таковым" [21.10]. Правило Кодда № 6 требует, чтобы все представления, теоретически обновляемые, были обновляемы и в конкретной системе. В своей короткой заметке Буфф (Buff) утверждает, что общая проблема обновляемости представлений неразрешима, т.е. не существует общего алгоритма определения обновляемости (в смысле Кодда) или ее отсутствия для произвольного представления. Тем не менее, следует заметить, что определение обновляемости, использованное в этой главе, несколько отличается от определения, введенного Коддом. Различие состоит в том, что использованное в этой главе определение обновляемости сформулировано в терминах предикатов отношений.
17.3. Chamberlin D.D., Gray J.N., Traiger I.L. Views, Authorization, and Locking in a Relational Data Base System // Proc. NCC 44. — Calif. Montvale, N.J.: AFIPS Press, 1975.
Содержит кроткое логическое обоснование подхода, использованного для обновления представлений в прототипе системы System R (и, следовательно, в системах SQL/DS и DB2, в стандарте SQL и т.п.). Обратите внимание на источник [17.13], который содержит аналогичное обоснование для прототипа системы INGRES.
17.4. Darwen H. Without Check Option. Relational Database Writings 1989-1991.— Reading, Mass.: Addison-Wesley, 1992.
17.5. Date C.J., McGoveran D. Updating Union, Intersection, and Difference Views // Database Programming & Design. — 1994. — 7, № 6.
17.6. Date C.J., McGoveran D. Updating Joins and Other Views // Ibid. —.№ 8.
17.7. Date C.J. Updating Views. Relational Database: Selected Writings.— Reading, Mass.: Addison-Wesley, 1986.
Здесь приведена более ранняя трактовка правил обновления представлений. Изложены правила только для обновления выборки, проекции и соединения. Эта работа упоминается здесь только для того, чтобы пояснить, что предложенные в ней идеи следует заменить новыми, изложенными в этой главе.
17.8. Dayal U., Bernstein P.A. On the Correct Translation of Update Operations on Relational Views // ACM TODS. — 1982. — 7, Ns 3.
Первое действительно формальное изложение правил обновления представлений (для выборок, проекций и соединений).
17.9. Furtado A.L., Casanova M.A. Updating Relational Views // Query Processing in Database Systems. — New York, N.Y.: Springer Verlag, 1985.
Описаны два достаточно общих подхода к решению проблемы обновления представлений. Один из них (в книге детально изложен только один подход) является попыткой разработки общего механизма, который работает независимо от сложности структуры базы данных. В этом подходе используется исключительно определение исследуемого представления. Другой подход, менее амбициозный, требует, чтобы администратор базы данных указал для каждого представления, какие обновления допустимы и какова семантика этих операций. Это выполняется посредством создания процедурного кода, реализующего обновления представлений в контексте исходных базовых отношений. Работа включает обзор функционирования каждого из подходов. Кроме того, в книге представлен обширный список литературы, изданной до 1985 года.
17.10. Goodman N. View Update Is Practical // InfoDB. — 1990. — 5, Ns 2.
Весьма неформальный прагматический обзор проблемы обновляемости представлений. Цитата из введения (несколько перефразированная): "Дайал (Dayal) и Бернстейн (Bernstein) [17.8] доказали, что, по существу, все интересные представления не являются обновляемыми. Буфф (Buff) [ 17.2] доказал, что не существует алгоритма определения обновляемости произвольного представления. Но, кажется, есть небольшая надежда. Однако ничто не может быть дальше от истины. Обновления представлений возможны и реальны".
17.11. Keller A.M. Algorithms for Translating View Updates to Database Updates for Views Involving Selections, Projections, and Joins // Proc. 4th ACM
SIGACT-SIGMOD Symposium on Principles of Database Systems. — Portland, Ore., 1985. -l
Предложен набор из пяти критериев, которым должен удовлетворять алгоритм обновления представлений: отсутствие побочных эффектов, только одноэтапные изменения, отсутствие ненужных изменений, отсутствие более простых замен и отсутствие пар DELETE-INSERT вместо UPDATE. В этой работе также представлены алгоритмы, которые удовлетворяют изложенным критериям. Кроме всего прочего, приведенные в книге алгоритмы позволяют реализовать обновления одного типа операциями другого типа. Например, операция DELETE на представлении может быть реализована посредством операции UPDATE на исходном базовом отношении (т.е. поставщик может быть удален из представления лондонских поставщиков путем замены значения атрибута города CITY на значение Paris). Другой пример (не вошедший в работу Келлера (Keller)): операция DELETE на представлении V (где V определено как вычитание A minus В) может быть реализована как вставка кортежа в В, а не как удаление кортежа из А. Заметьте, что в данной главе мы отбросили подобные способы реализации операций обновления вследствие описанных в этой главе принципов.
17.12. McGoveran D., Date C.J. A New Database Design Principle // Database Programming & Design. — 1994. — 7, № 7.
Пусть А и В являются произвольными отношениями с предикатами РА и РВ соответственно. Говорят, что А и В перекрываются тогда и только тогда, когда можно создать такой кортеж t, что истинными будут оба выражения, PA(t) и PB(t). Тогда принцип проектирования можно записать так:
Пусть А' и В'— два произвольных отношения базы данных и пусть А и В являются проекциями А' и В' соответственно по всем атрибутам, для которых не установлено значение по умолчанию.
Под "декомпозицией без потерь" здесь понимается декомпозиция данного отношения на несколько проекций, причем: а) данное отношение может быть воссоздано с помощью соединения всех проекций; б) ни одна из проекций не является избыточной в процессе воссоздания исходного отношения.
В работе представлено несколько примеров и аргументов в поддержку этого принципа, а также указаны последствия соблюдения этого принципа, состоящие в том, что если А и В — любые базовые отношения совместимых типов, то всегда истинны следующие утверждения:
A UNION В непересекающееся объединение A INTERSECT В всегда пустое множество
A MINUS В равно А
В работе заостряется внимание на том, что данный принцип одинаково применим к так называемым индивидуальным базам данных, которые являются индивидуальным восприятием пользователя исходной совместно используемой базы данных. Индивидуальные базы данных определяются с помощью представлений и базовых отношений. Другими словами, подобные индивидуальные пользовательские базы данных не должны включать любых двух представлений или отношений, которые нарушают сформулированный принцип. По существу, по тем же причинам совместно используемая база данных не должна содержать любых двух базовых отношений, нарушающих этот принцип.
17.13. Stonebraker M.R. Implementation of Views and Integrity Constraints by Query Modification // Proc. ACM SIGMOD Intern. Conf. on Management of Data. — San Jose, Calif, 1975.
См. комментарии к [17.3J.
Ответы к некоторым упражнениям
17.1. Приведенные ниже ответы пронумерованы как 17.1.и, где п— номер примера в разделе 17.3.
17.1.1. CREATE VIEW REDPARTS AS
( P.P#, P.PNAME, P.WEIGHT AS WT, Р.СIТУ ) WHERE P.COLQR = 'Red' ;
17.1.2. CREATE VIEW PQ AS
( SP.P#,
SUM ( SPX WHERE SPX.P# = SP.P#, QТУ ) AS TOTQTY ) ;
Конечно, в этом выражении предпочтительнее заменить два вхождения SP.P# на Р.Р#, но тогда будет получено представление, не являющееся точным аналогом исходного алгебраического представления.
17.1.3. CREATE VIEW CITY_PAIRS AS
( S.CITY AS SCITY, P.CITY AS PCITY ) WHERE EXISTS ( SP WHERE SP.S# = S.S# AND SP.P# = P.P# ) ;
17.1.4. CREATE VIEW LCNDON_REDPARTS AS
( REDPARTS WHERE REDPARTS. CITY = 'London' ) ;
Замечание. Ответы к упр. 17.2-17.5 также сформулированы в терминах реляционного исчисления.
17.2. CREATE VIEW NQN_COLOCATED AS
( S.S#, P.P# ) WHERE S.CITY <> Р.С1ТУ ;
17.3. CREATE VIEW LONDON_SUPPLIERS AS
( S.S#, S.SNAME, S.STATUS ) WHERE S.CITY = 'London' ;
Из представления исключен атрибут CITY, так как известно, что значение этого атрибута везде будет London. Тем не менее, следует заметить: такой пропуск атрибута означает, что любая операция INSERT на данном представлении будет завершена неудачей (только если для атрибута S.CITY не выбрано значение по умолчанию, равное London). Другими словами, подобные представления явно не могут поддерживать операцию INSERT. (В качестве альтернативы существует идея определения значения по умолчанию для атрибута CITY для кортежей, вставляемых через данное представление. Таким значением, конечно, следует указать London. Идея значений по умолчанию, специфических для представления, требует более глубокого изучения.
17.4. Проблема состоит в следующем. Как определить атрибут SP.QTY? Разумным решением будет ответ, что для данной пары S#-P# атрибут SP.QTY можно определить как сумму всех значений SPJ.QTY, которая вычисляется по всем номерам J# для выбранной пары S#-P#.
СREAТЕ VIEW SP AS
( SPJX.S#, SPJX.P#,
SUM ( SPJY WHERE SPJY.S# = SPJX.S#
AND SPJY.P# = SPJX.P#, QTY ) AS QTY ) ;
17.5. CREATE VIEW JC AS
( J.J#, J.CITY ) WHERE EXISTS SPJ ( SPJ.S# = 'Sl' AND SPJ.P# = 'Р1’ AND
SPJ.J# = J.J# ) ;
17.6. Преобразованные формы читателю предлагается записать самостоятельно. Тем не менее, заметим, что случай (д) завершится неудачей, так как вставляемый кортеж не удовлетворяет предикату представления.
17.7. В этом случае (д) также завершится неудачей, но теперь причина будет несколько иной. Во-первых, так как пользователь не передает системе "реального" значения атрибута WEIGHT (и, конечно, не может этого сделать), то для этого атрибута СУБД будет обеспечивать значение по умолчанию, пусть это будет w. Во-вторых, значение атрибута WT, которое передал пользователь, не обязательно будет равным w*454, даже если значение атрибута WT превышает 14. Следовательно, вставляемый кортеж опять не удовлетворяет предикат представления.
17.8. Приведенный список причин взят из [4.15].
• Если пользователи оперируют с представлениями вместо базовых отношений, то ясно, что представления должны быть похожи на базовые отношения насколько это возможно. В идеальной ситуации пользователь может даже не догадываться, что оперирует с представлениями, но он должен иметь возможность трактовать представления как базовые отношения. И как пользователь базовых отношений получает информацию о потенциальных ключах базового отношения, так и пользователь представления должен иметь возможность получения информации о потенциальных ключах представления. Явное объявление потенциальных ключей сделает эту информацию доступной пользователям представлений.
• СУБД может не определять потенциальных ключей для себя (это утверждение истинно для всех современных СУБД) Таким образом, явное объявление потенциальных ключей — единственно доступный (для администратора базы данных) способ информирования СУБД и пользователей о наличии таких ключей.
• Даже если бы СУБД могли самостоятельно выводить потенциальные ключи, явное объявление, по крайней мере, позволило бы системе удостовериться, что выведенные ею ключи не являются несовместимыми с ключами, которые объявил администратор базы данных.
• Администратор базы данных может располагать дополнительной информацией, которая не заложена в СУБД, и, следовательно, оптимизировать ключи, выведенные СУБД. В [4.15] приведен пример такой возможности.
В [10.3] предложен другой довод, который, по существу, сводится к тому, что подобная возможность (явное объявление потенциальных ключей) обеспечивает простой и удобный способ изложения важных условий целостности, в противном случае их описание будет весьма многословным.
17.9. Очевидно, что на эти вопросы невозможно дать окончательных ответов. Ниже изложены некоторые наблюдения
• Каждое представление и каждый снимок будет иметь запись в отношении RELATIONS с соответствующим ("View" или "Snapshot") значением атрибута RELTYPE.
• Каждое представление также будет иметь запись в новом отношении, которое нужно включить в каталог базы данных. Назовем это отношение VIEWS. Кортеж этого отношения должен содержать подходящее выражение, которое определяет представление.
• Аналогично, каждый снимок будет иметь запись в новом отношении (SNAPSHOTS), которое появится в каталоге базы данных. Кортеж этого отношения должен содержать выражение, определяющее снимок данных, а также данные об интервале обновления.
• Еще одно новое отношение будет содержать информацию о ссылках между представлениями и снимками. Заметьте, что структура этого отношения подобна структуре отношения PART_STRUCTURE (см. рис. 4.4 в главе 4) — как одна часть может содержать другую, так и представление может быть определено в терминах других представлений и снимков.
17.10. Да! Но заметьте следующее. Предположим, что отношение S с данными о поставщиках заменено выборками SA и SB, где SA содержит данные о поставщиках в Лондоне, a SB — данные о поставщиках, расположенных вне Лондона. Теперь посредством объединения SA и SB можно создать представление с именем S. Если через это представление попытаться для лондонских поставщиков заменить название города каким-либо другим или для поставщиков вне Лондона попытаться указать, что поставщик расположен в Лондоне, то при реализации операция UPDATE будет преобразована в операцию DELETE на одной выборке и в операцию INSERT на другой. Изложенные в этой главе правила работают в данном случае корректно, так как операция UPDATE определена как пара DELETE-INSERT. Тем не менее, в главе было сделано неявное предположение, что для обеспечения большей эффективности в реализации будет использоваться операция UPDATE. Этот пример показал, что преобразование операции UPDATE на представлениях в операцию UPDATE на исходных базовых отношениях не всегда дает правильные результаты. Фактически, поиск случаев, когда названное преобразование не работает, можно отнести к задачам оптимизации.
17.11. а) да; б) да.
17.12. Для объединения и вычитания операции insert и delete всегда являются противоположными, хотя для пересечения это может быть не так. Например, если А и В — различные базовые отношения, то вставка кортежа t в пересечение V = A intersect В может привести к вставке кортежа t только в отношение А (если этот кортеж уже присутствует в В). Заметим еще раз, что подобная асимметрия может возникнуть, только если база данных плохо спроектирована [17.12].
17.13. Ниже изложены некоторые комментарии. Прежде всего, процесс замены потребует выполнения действий в несколько этапов. (Эта последовательность операций будет усовершенствована ниже.)
CREATE BASE RELATION SNC
( S# DOMAIN ( S# ),
SNAME DOMAIN ( NAME ),
CITY DOMAIN ( CITY ) )
PRIMARY KEY ( S# ) ;
CREATE BASE RELATION ST '.
( S# DOMAIN ( S# ), STATUS DOMAIN ( STATUS ) )
PRIMARY KEY ( S# ) ;
INSERT S [ S#, SNAME, CITY ] INTO SNC ;
INSERT S [ S#, STATUS ] INTO ST ;
DESTROY BASE RELATION S ;
Теперь можно создать необходимое представление:
CREATE VIEW S ИЗ SNC JOIN ST ;
Заметим, что каждый из атрибутов SNC.S# и ST.S# можно рассматривать как внешние ключи, ссылающиеся друг на друга.
Заметьте также, что нужно что-то предпринять относительно внешнего ключа SP.S# в отношении SP. Этот внешний ключ ссылается на старое отношение S. Было бы хорошо, если бы можно было просто перенаправить внешний ключ на представление S. Если этого нельзя сделать (а это нельзя делать в большинстве современных программ), то в базе данных лучше создать еще одну проекцию базового отношения S. Соответствующее выражение показано ниже:
CREATE BASE RELATION SS
( S# DOMAIN ( S# ) )
PRIMARY KEY ( S# ) ;
INSERT S [ S# ] INTO SS ;
(Фактически в [12.9] этот прием рекомендуется использовать по разным другим причинам.) Теперь определение представления S примет вид
CREATE VIEW S AS SS JOIN SNC JOIN ST ;
Кроме этого, в определения отношений SNC и ST добавляются определения внешнего ключа:
FOREIGN KEY ( S# ) REFERENCES SS
DELETE CASCADES UPDATE CASCADES
И, наконец, нужно поменять спецификацию внешнего ключа SP.S# в отношении SP, чтобы этот ключ ссылался не на отношение S, а на отношение SS.
Замечание. Идея, позволяющая внешним ключам ссылаться на представления вместо базовых отношений, требует более глубокого изучения.
17.14. Ниже приведен пример операции выборки на представлении, которая завершалась неудачей в некоторых программных продуктах, существовавших к моменту создания книги.
CREATE VIEW PQ AS
SELECT SP.P#, SUM (SP.OTY ) AS TOTQTY
FROM SP
GROUP BY SP.P# ;
Рассмотрим также следующий запрос:
SELECT AVG ( PQ.TOTQTY ) AS PT FROM PQ ;
Если следовать описанному в данной главе процессу подстановки (т.е. мы попытаемся заменить все вхождения имени представления выражением, которое определяет представление), то получится
SELECT AVG ( SUM ( SP.QTY ) ) AS PT
FROM SP
GROOP BY SP.P# ;
Это некорректное SELECT-выражение, так как SQL не позволяет вкладывать агрегативные функции друг в друга.
Ниже показан другой пример запроса к тому же представлению PQ, который также завершается неудачей (и по той же причине).
SELECT PQ.P#
FROM PQ
WHERE PQ.TOTQTY > 500 ;
Именно по причине, продемонстрированной примерами выше, некоторые программные продукты (в частности, IBM DB2) иногда материализуют представление (вместо использования обычного в этих случаях процесса подстановки) и после этого выполняют запрос на материализованной версии представления. Этот прием, конечно, всегда дает правильные результаты, но снижает производительность. (Более того, в случае СУБД DB2 на некоторых представлениях все еще существуют отдельные операции выборки, которые завершаются неудачей.)