<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="ru">
	<id>https://iu5bmstu.ru/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=94.79.44.124</id>
	<title>Кафедра ИУ5 МГТУ им. Н.Э.Баумана, студенческое сообщество - Вклад [ru]</title>
	<link rel="self" type="application/atom+xml" href="https://iu5bmstu.ru/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=94.79.44.124"/>
	<link rel="alternate" type="text/html" href="https://iu5bmstu.ru/index.php?title=%D0%A1%D0%BB%D1%83%D0%B6%D0%B5%D0%B1%D0%BD%D0%B0%D1%8F:%D0%92%D0%BA%D0%BB%D0%B0%D0%B4/94.79.44.124"/>
	<updated>2026-04-30T05:35:18Z</updated>
	<subtitle>Вклад</subtitle>
	<generator>MediaWiki 1.41.0</generator>
	<entry>
		<id>https://iu5bmstu.ru/index.php?title=%D0%A2%D0%9E%D0%A0%D0%90_(9)_-_%D0%9B%D0%B5%D0%BA%D1%86%D0%B8%D1%8F_%E2%84%9612_-_%D0%9E%D1%86%D0%B5%D0%BD%D0%BA%D0%B8_(%D0%BF%D1%80%D0%BE%D0%B4%D0%BE%D0%BB%D0%B6%D0%B5%D0%BD%D0%B8%D0%B5)&amp;diff=2479</id>
		<title>ТОРА (9) - Лекция №12 - Оценки (продолжение)</title>
		<link rel="alternate" type="text/html" href="https://iu5bmstu.ru/index.php?title=%D0%A2%D0%9E%D0%A0%D0%90_(9)_-_%D0%9B%D0%B5%D0%BA%D1%86%D0%B8%D1%8F_%E2%84%9612_-_%D0%9E%D1%86%D0%B5%D0%BD%D0%BA%D0%B8_(%D0%BF%D1%80%D0%BE%D0%B4%D0%BE%D0%BB%D0%B6%D0%B5%D0%BD%D0%B8%D0%B5)&amp;diff=2479"/>
		<updated>2013-01-08T13:36:40Z</updated>

		<summary type="html">&lt;p&gt;94.79.44.124: /* Формулы оценки стоимости соединения NLJ */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Tabli4ka warning undone summary|text=&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;- схемы [[#Механизм сортировки таблиц | образования файлов со второго уровня и до последнего]].&amp;lt;br&amp;gt;А также не все [[#Формулы оценки стоимости соединения SMJ | формулы из раздела оценки SMJ]] верные.}}&lt;br /&gt;
{{Backward|l=ТОРА (9) - Лекция №11 - Оценки}}&lt;br /&gt;
Оригинал всего раздела, посвящённого оптимизации SQL-запросов, от самого [[Григорьев Ю.А. | Григорьева]] можно загрузить [http://yadi.sk/d/VjjMs6ww1HH2D здесь].&lt;br /&gt;
__TOC__&lt;br /&gt;
== Оптимизация SQL-запросов ==&lt;br /&gt;
&lt;br /&gt;
=== Методы соединения таблиц ===&lt;br /&gt;
&lt;br /&gt;
==== Метод вложенных циклов (NLJ, Nested Loop Join) ====&lt;br /&gt;
&lt;br /&gt;
Каждая запись первой соединяемой таблицы сравнивается с каждой записью второй соединяемой таблицы. В общем случае, условие сравнения может быть произвольным.&lt;br /&gt;
&lt;br /&gt;
[[Файл:9sTORAl11pic4.png|500px|center]]&lt;br /&gt;
&lt;br /&gt;
Зависит от:&lt;br /&gt;
&lt;br /&gt;
* используемого дерева соединения (но мы в дальнейшем всегда будем использовать левосторонние);&lt;br /&gt;
* назначения буферов ввода/вывода.&lt;br /&gt;
&lt;br /&gt;
[[Файл:9sTORAl12pic1.png|600px|center]]&lt;br /&gt;
&lt;br /&gt;
Если на 3 операции блоков будет больше {{Формула|f=b}}, то лишние сохраняются на диск.&lt;br /&gt;
&lt;br /&gt;
===== Формулы оценки стоимости соединения NLJ =====&lt;br /&gt;
&lt;br /&gt;
{{Формула|f=C^{JOIN} = C_{CPU} + C_{I/O} }}&lt;br /&gt;
&lt;br /&gt;
{{Формула|f=C_{CPU}=T (Q_1)\cdot T(Q_2)\cdot C_{comp} }}&lt;br /&gt;
&lt;br /&gt;
{{Формула|f=C_{I/O} = C_{I/O}(Q_2)\cdot\Bigl\lfloor\frac{B(Q_1)}{b}\Bigr\rfloor}}&lt;br /&gt;
&lt;br /&gt;
здесь:&lt;br /&gt;
&lt;br /&gt;
:{{Формула|f=T(Q_1)}}, {{Формула|f=T(Q_2)}} оценка числа записей в таблицах подзапросов {{Формула|f=Q_1}} и {{Формула|f=Q_2}};&lt;br /&gt;
:{{Формула|f=B(Q_1)}} - число блоков ввода/вывода для получения таблицы {{Формула|f=Q_1}};&lt;br /&gt;
:{{Формула|f=C_{I/O}(Q_2)}} - время ввода/вывода для получения таблицы {{Формула|f=Q_2}};&lt;br /&gt;
:{{Формула|f=b}} - число блоков в буферах 1 и 3 (&#039;&#039;из рисунка выше&#039;&#039;);&lt;br /&gt;
:{{Формула|f=C_{comp} }} - время сравнения двух кортежей из {{Формула|f=Q_1}} и {{Формула|f=Q_2}} в оперативной памяти;&lt;br /&gt;
&lt;br /&gt;
:неполные квадратные скобки означают округление с недостатком, так как одно чтение с диска учитывается в стоимости выбора записей из исходных таблиц.&lt;br /&gt;
&lt;br /&gt;
==== Метод сортировки слияния (SMJ, Sort Merge Join) ====&lt;br /&gt;
&lt;br /&gt;
Соединение двух таблиц этим методом выполняется по следующим шагам:&lt;br /&gt;
&lt;br /&gt;
# соединяемые таблицы сортируются по атрибуту соединения, будем обозначать его через {{Формула|f=a}};&lt;br /&gt;
# организуется вложенный цикл, где выполняется сравнение значения атрибута соединения в записях таблиц {{Формула|f=Q_1}} и {{Формула|f=Q_2}}. Условием соединения может быть только равенство атрибутов соединения.&lt;br /&gt;
&lt;br /&gt;
Рассмотрим пример реализации второго шага.&lt;br /&gt;
&lt;br /&gt;
Выполняется сравнение записей в таблицах {{Формула|f=Q_1}} и {{Формула|f=Q_2}}, на которые указывают указатели. Перемещение указателей выполняется следующим образом:&lt;br /&gt;
&lt;br /&gt;
* если выполняется условие {{Формула|f=&amp;lt;}}, то указатель перемещается в таблицу {{Формула|f=Q_1}};&lt;br /&gt;
* если выполняется условие {{Формула|f=&amp;gt;}}, то указатель перемещается в таблицу {{Формула|f=Q_2}};&lt;br /&gt;
* если выполняется условие {{Формула|f==}}, то результат соединения перемещается в выходной буфер, указатели не перемещаются и выполняется сравнение со следующей записью из таблицы {{Формула|f=Q_2}}.&lt;br /&gt;
&lt;br /&gt;
[[Файл:9sTORAl12pic2.png|500px|center]]&lt;br /&gt;
&lt;br /&gt;
Результат соединения {{Формула|f=Q_1}} и {{Формула|f=Q_2}} получается уже отсортированным.&lt;br /&gt;
&lt;br /&gt;
===== Формулы оценки стоимости соединения SMJ =====&lt;br /&gt;
&lt;br /&gt;
{{Формула|f=C_{CPU} = [C^{SORT}_{CPU}(Q_1)] + [C^{SORT}_{CPU}(Q_2)] + C^{JOIN}_{CPU}(Q_1, Q_2)}}&lt;br /&gt;
&lt;br /&gt;
{{Формула|f=C_{I/O} = [C^{SORT}_{I/O}(Q_1)] + [C^{SORT}_{I/O}(Q_2)] + C^{JOIN}_{I/O}(Q_1, Q_2)}}&lt;br /&gt;
&lt;br /&gt;
{{Формула|f=C^{SORT}_{CPU}(R) = T(R)\cdot\log_b\Bigl(\frac{T(R)}{\lceil B(R)/b\rceil}\Bigr)\cdot (C_{comp} + C_{move}) + \Bigl(\log_b B(R) - 1\Bigr)\cdot T(R)\cdot (b\cdot C_{comp} + C_{move}) }}&lt;br /&gt;
&lt;br /&gt;
{{Формула|f=C^{SORT}_{I/O}(R) = 2\cdot B(R)\cdot C_B}}&lt;br /&gt;
&lt;br /&gt;
Далее возможны варианты:&lt;br /&gt;
&lt;br /&gt;
* {{Формула|f=C^{JOIN}_{CPU}(Q_1, Q_2) = \Bigl(\Bigl(\frac{T(Q_2)}{Q_1, a} + 2\Bigr)\cdot T(Q_2) + T(Q_1)\cdot \Bigl(1 - \frac{I(Q_2, a)}{I(Q_1, a)}\Bigr)\Bigr)\cdot C_{comp} }}, если {{Формула|f=I(Q_1, a) &amp;gt; I(Q_2, a)}};&lt;br /&gt;
&lt;br /&gt;
* {{Формула|f=C^{JOIN}_{CPU}(Q_1, Q_2) = \Bigl(\Bigl(\frac{T(Q_1)}{Q_2, a} + 2\Bigr)\cdot T(Q_1) + T(Q_2)\cdot \Bigl(1 - \frac{I(Q_1, a)}{I(Q_2, a)}\Bigr)\Bigr)\cdot C_{comp} }}, если {{Формула|f=I(Q_2, a) &amp;gt; I(Q_1, a)}}.&lt;br /&gt;
&lt;br /&gt;
{{Формула|f=C^{JOIN}_{I/O} = [B(Q_1)] + [B(Q_2)] + \Bigl(\frac{T(Q_1)}{Q_2, a}\cdot \Bigl\lfloor \frac{B(Q_1)}{I(Q_2, a)\cdot b}\Bigr\rfloor\cdot b\cdot min(I(Q_1, a), I(Q_2, a)\Bigr)\cdot C_B}}&lt;br /&gt;
&lt;br /&gt;
здесь:&lt;br /&gt;
&lt;br /&gt;
:{{Формула|f=T(Q_1)}}, {{Формула|f=T(Q_2)}} - оценка числа записей в таблицах {{Формула|f=Q_1}} и {{Формула|f=Q_2}};&lt;br /&gt;
:{{Формула|f=B(Q_1)}}, {{Формула|f=B(Q_2)}} - оценка числа блоков в этих же таблицах;&lt;br /&gt;
:{{Формула|f=I(Q_1, a)}}, {{Формула|f=I(Q_2, a)}} - мощности атрибутов в соединении {{Формула|f=a}} тех же таблиц;&lt;br /&gt;
:{{Формула|f=b}} - число блоков в оперативной памяти, отводимое под сортировку этих таблиц, а также для выполнения соединения;&lt;br /&gt;
:{{Формула|f=C_{comp} }} - среднее время соединения двух кортежей из записей этих таблиц в оперативной памяти;&lt;br /&gt;
:{{Формула|f=C_{move} }} - время перемещения одной записи в оперативной памяти при сортировке;&lt;br /&gt;
:{{Формула|f=C_B}} - время чтения/записи одного блока на диск;&lt;br /&gt;
:верхние неполные квадратные скобки - округление с избытком;&lt;br /&gt;
:нижние неполные квадратные скобки - округление с недостатком;&lt;br /&gt;
:обычные квадратные скобки - необязательность, значит уже отсортировано.&lt;br /&gt;
&lt;br /&gt;
===== Механизм сортировки таблиц =====&lt;br /&gt;
&lt;br /&gt;
Механизм сортировки таблиц {{Формула|f=Q_1}} и {{Формула|f=Q_2}}:&lt;br /&gt;
# блоки таблицы {{Формула|f=R}} читаются в буфер и там сортируются. Получается файл, который сохраняется на диск;&lt;br /&gt;
# в буфер читаются ещё блоки.&lt;br /&gt;
&lt;br /&gt;
Таким образом, на диске будет сохранено несколько файлов, и в каждом записи будут отсортированы. Эти файлы образуют первый уровень.&lt;br /&gt;
&lt;br /&gt;
{{Формула|f=\frac{T(R)}{\lceil B(R) / b\rceil} }} - оценка числа записей в одном файле первого уровня.&lt;br /&gt;
&lt;br /&gt;
{{Формула|f=\frac{T(R)}{\lceil B(R) / b\rceil}\cdot log_2\frac{T(R)}{\lceil B(R) / b\rceil} }} - число операций сравнений и перемещений записей при сортировке одного файла первого уровня. Но таких файлов {{Формула|f=\frac{B(R)}{b} }}. Перемножая их, получаем общее число операций.&lt;br /&gt;
&lt;br /&gt;
В конце концов всё сложится в один файл.&lt;br /&gt;
&lt;br /&gt;
{{Forward|l=ТОРА (9) - Лекция №13 - Оценки (продолжение)}}&lt;br /&gt;
&lt;br /&gt;
[[Категория:Теоретические основы реляционной алгебры (9 семестр)]]&lt;br /&gt;
[[Категория:Конспекты лекций и семинаров]]&lt;br /&gt;
[[Категория:Незаконченные конспекты]]&lt;/div&gt;</summary>
		<author><name>94.79.44.124</name></author>
	</entry>
	<entry>
		<id>https://iu5bmstu.ru/index.php?title=%D0%A2%D0%9E%D0%A0%D0%90_(9)_-_%D0%9B%D0%B5%D0%BA%D1%86%D0%B8%D1%8F_%E2%84%9612_-_%D0%9E%D1%86%D0%B5%D0%BD%D0%BA%D0%B8_(%D0%BF%D1%80%D0%BE%D0%B4%D0%BE%D0%BB%D0%B6%D0%B5%D0%BD%D0%B8%D0%B5)&amp;diff=2478</id>
		<title>ТОРА (9) - Лекция №12 - Оценки (продолжение)</title>
		<link rel="alternate" type="text/html" href="https://iu5bmstu.ru/index.php?title=%D0%A2%D0%9E%D0%A0%D0%90_(9)_-_%D0%9B%D0%B5%D0%BA%D1%86%D0%B8%D1%8F_%E2%84%9612_-_%D0%9E%D1%86%D0%B5%D0%BD%D0%BA%D0%B8_(%D0%BF%D1%80%D0%BE%D0%B4%D0%BE%D0%BB%D0%B6%D0%B5%D0%BD%D0%B8%D0%B5)&amp;diff=2478"/>
		<updated>2013-01-08T13:36:15Z</updated>

		<summary type="html">&lt;p&gt;94.79.44.124: /* Формулы оценки стоимости соединения NLJ */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Tabli4ka warning undone summary|text=&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;- схемы [[#Механизм сортировки таблиц | образования файлов со второго уровня и до последнего]].&amp;lt;br&amp;gt;А также не все [[#Формулы оценки стоимости соединения SMJ | формулы из раздела оценки SMJ]] верные.}}&lt;br /&gt;
{{Backward|l=ТОРА (9) - Лекция №11 - Оценки}}&lt;br /&gt;
Оригинал всего раздела, посвящённого оптимизации SQL-запросов, от самого [[Григорьев Ю.А. | Григорьева]] можно загрузить [http://yadi.sk/d/VjjMs6ww1HH2D здесь].&lt;br /&gt;
__TOC__&lt;br /&gt;
== Оптимизация SQL-запросов ==&lt;br /&gt;
&lt;br /&gt;
=== Методы соединения таблиц ===&lt;br /&gt;
&lt;br /&gt;
==== Метод вложенных циклов (NLJ, Nested Loop Join) ====&lt;br /&gt;
&lt;br /&gt;
Каждая запись первой соединяемой таблицы сравнивается с каждой записью второй соединяемой таблицы. В общем случае, условие сравнения может быть произвольным.&lt;br /&gt;
&lt;br /&gt;
[[Файл:9sTORAl11pic4.png|500px|center]]&lt;br /&gt;
&lt;br /&gt;
Зависит от:&lt;br /&gt;
&lt;br /&gt;
* используемого дерева соединения (но мы в дальнейшем всегда будем использовать левосторонние);&lt;br /&gt;
* назначения буферов ввода/вывода.&lt;br /&gt;
&lt;br /&gt;
[[Файл:9sTORAl12pic1.png|600px|center]]&lt;br /&gt;
&lt;br /&gt;
Если на 3 операции блоков будет больше {{Формула|f=b}}, то лишние сохраняются на диск.&lt;br /&gt;
&lt;br /&gt;
===== Формулы оценки стоимости соединения NLJ =====&lt;br /&gt;
&lt;br /&gt;
{{Формула|f=C^{JOIN} = C_{CPU} + C_{I/O} }}&lt;br /&gt;
&lt;br /&gt;
{{Формула|f=C_{CPU}=T {Q_1}\cdot T(Q_2)\cdot C_{comp} }}&lt;br /&gt;
&lt;br /&gt;
{{Формула|f=C_{I/O} = C_{I/O}(Q_2)\cdot\Bigl\lfloor\frac{B(Q_1)}{b}\Bigr\rfloor}}&lt;br /&gt;
&lt;br /&gt;
здесь:&lt;br /&gt;
&lt;br /&gt;
:{{Формула|f=T(Q_1)}}, {{Формула|f=T(Q_2)}} оценка числа записей в таблицах подзапросов {{Формула|f=Q_1}} и {{Формула|f=Q_2}};&lt;br /&gt;
:{{Формула|f=B(Q_1)}} - число блоков ввода/вывода для получения таблицы {{Формула|f=Q_1}};&lt;br /&gt;
:{{Формула|f=C_{I/O}(Q_2)}} - время ввода/вывода для получения таблицы {{Формула|f=Q_2}};&lt;br /&gt;
:{{Формула|f=b}} - число блоков в буферах 1 и 3 (&#039;&#039;из рисунка выше&#039;&#039;);&lt;br /&gt;
:{{Формула|f=C_{comp} }} - время сравнения двух кортежей из {{Формула|f=Q_1}} и {{Формула|f=Q_2}} в оперативной памяти;&lt;br /&gt;
&lt;br /&gt;
:неполные квадратные скобки означают округление с недостатком, так как одно чтение с диска учитывается в стоимости выбора записей из исходных таблиц.&lt;br /&gt;
&lt;br /&gt;
==== Метод сортировки слияния (SMJ, Sort Merge Join) ====&lt;br /&gt;
&lt;br /&gt;
Соединение двух таблиц этим методом выполняется по следующим шагам:&lt;br /&gt;
&lt;br /&gt;
# соединяемые таблицы сортируются по атрибуту соединения, будем обозначать его через {{Формула|f=a}};&lt;br /&gt;
# организуется вложенный цикл, где выполняется сравнение значения атрибута соединения в записях таблиц {{Формула|f=Q_1}} и {{Формула|f=Q_2}}. Условием соединения может быть только равенство атрибутов соединения.&lt;br /&gt;
&lt;br /&gt;
Рассмотрим пример реализации второго шага.&lt;br /&gt;
&lt;br /&gt;
Выполняется сравнение записей в таблицах {{Формула|f=Q_1}} и {{Формула|f=Q_2}}, на которые указывают указатели. Перемещение указателей выполняется следующим образом:&lt;br /&gt;
&lt;br /&gt;
* если выполняется условие {{Формула|f=&amp;lt;}}, то указатель перемещается в таблицу {{Формула|f=Q_1}};&lt;br /&gt;
* если выполняется условие {{Формула|f=&amp;gt;}}, то указатель перемещается в таблицу {{Формула|f=Q_2}};&lt;br /&gt;
* если выполняется условие {{Формула|f==}}, то результат соединения перемещается в выходной буфер, указатели не перемещаются и выполняется сравнение со следующей записью из таблицы {{Формула|f=Q_2}}.&lt;br /&gt;
&lt;br /&gt;
[[Файл:9sTORAl12pic2.png|500px|center]]&lt;br /&gt;
&lt;br /&gt;
Результат соединения {{Формула|f=Q_1}} и {{Формула|f=Q_2}} получается уже отсортированным.&lt;br /&gt;
&lt;br /&gt;
===== Формулы оценки стоимости соединения SMJ =====&lt;br /&gt;
&lt;br /&gt;
{{Формула|f=C_{CPU} = [C^{SORT}_{CPU}(Q_1)] + [C^{SORT}_{CPU}(Q_2)] + C^{JOIN}_{CPU}(Q_1, Q_2)}}&lt;br /&gt;
&lt;br /&gt;
{{Формула|f=C_{I/O} = [C^{SORT}_{I/O}(Q_1)] + [C^{SORT}_{I/O}(Q_2)] + C^{JOIN}_{I/O}(Q_1, Q_2)}}&lt;br /&gt;
&lt;br /&gt;
{{Формула|f=C^{SORT}_{CPU}(R) = T(R)\cdot\log_b\Bigl(\frac{T(R)}{\lceil B(R)/b\rceil}\Bigr)\cdot (C_{comp} + C_{move}) + \Bigl(\log_b B(R) - 1\Bigr)\cdot T(R)\cdot (b\cdot C_{comp} + C_{move}) }}&lt;br /&gt;
&lt;br /&gt;
{{Формула|f=C^{SORT}_{I/O}(R) = 2\cdot B(R)\cdot C_B}}&lt;br /&gt;
&lt;br /&gt;
Далее возможны варианты:&lt;br /&gt;
&lt;br /&gt;
* {{Формула|f=C^{JOIN}_{CPU}(Q_1, Q_2) = \Bigl(\Bigl(\frac{T(Q_2)}{Q_1, a} + 2\Bigr)\cdot T(Q_2) + T(Q_1)\cdot \Bigl(1 - \frac{I(Q_2, a)}{I(Q_1, a)}\Bigr)\Bigr)\cdot C_{comp} }}, если {{Формула|f=I(Q_1, a) &amp;gt; I(Q_2, a)}};&lt;br /&gt;
&lt;br /&gt;
* {{Формула|f=C^{JOIN}_{CPU}(Q_1, Q_2) = \Bigl(\Bigl(\frac{T(Q_1)}{Q_2, a} + 2\Bigr)\cdot T(Q_1) + T(Q_2)\cdot \Bigl(1 - \frac{I(Q_1, a)}{I(Q_2, a)}\Bigr)\Bigr)\cdot C_{comp} }}, если {{Формула|f=I(Q_2, a) &amp;gt; I(Q_1, a)}}.&lt;br /&gt;
&lt;br /&gt;
{{Формула|f=C^{JOIN}_{I/O} = [B(Q_1)] + [B(Q_2)] + \Bigl(\frac{T(Q_1)}{Q_2, a}\cdot \Bigl\lfloor \frac{B(Q_1)}{I(Q_2, a)\cdot b}\Bigr\rfloor\cdot b\cdot min(I(Q_1, a), I(Q_2, a)\Bigr)\cdot C_B}}&lt;br /&gt;
&lt;br /&gt;
здесь:&lt;br /&gt;
&lt;br /&gt;
:{{Формула|f=T(Q_1)}}, {{Формула|f=T(Q_2)}} - оценка числа записей в таблицах {{Формула|f=Q_1}} и {{Формула|f=Q_2}};&lt;br /&gt;
:{{Формула|f=B(Q_1)}}, {{Формула|f=B(Q_2)}} - оценка числа блоков в этих же таблицах;&lt;br /&gt;
:{{Формула|f=I(Q_1, a)}}, {{Формула|f=I(Q_2, a)}} - мощности атрибутов в соединении {{Формула|f=a}} тех же таблиц;&lt;br /&gt;
:{{Формула|f=b}} - число блоков в оперативной памяти, отводимое под сортировку этих таблиц, а также для выполнения соединения;&lt;br /&gt;
:{{Формула|f=C_{comp} }} - среднее время соединения двух кортежей из записей этих таблиц в оперативной памяти;&lt;br /&gt;
:{{Формула|f=C_{move} }} - время перемещения одной записи в оперативной памяти при сортировке;&lt;br /&gt;
:{{Формула|f=C_B}} - время чтения/записи одного блока на диск;&lt;br /&gt;
:верхние неполные квадратные скобки - округление с избытком;&lt;br /&gt;
:нижние неполные квадратные скобки - округление с недостатком;&lt;br /&gt;
:обычные квадратные скобки - необязательность, значит уже отсортировано.&lt;br /&gt;
&lt;br /&gt;
===== Механизм сортировки таблиц =====&lt;br /&gt;
&lt;br /&gt;
Механизм сортировки таблиц {{Формула|f=Q_1}} и {{Формула|f=Q_2}}:&lt;br /&gt;
# блоки таблицы {{Формула|f=R}} читаются в буфер и там сортируются. Получается файл, который сохраняется на диск;&lt;br /&gt;
# в буфер читаются ещё блоки.&lt;br /&gt;
&lt;br /&gt;
Таким образом, на диске будет сохранено несколько файлов, и в каждом записи будут отсортированы. Эти файлы образуют первый уровень.&lt;br /&gt;
&lt;br /&gt;
{{Формула|f=\frac{T(R)}{\lceil B(R) / b\rceil} }} - оценка числа записей в одном файле первого уровня.&lt;br /&gt;
&lt;br /&gt;
{{Формула|f=\frac{T(R)}{\lceil B(R) / b\rceil}\cdot log_2\frac{T(R)}{\lceil B(R) / b\rceil} }} - число операций сравнений и перемещений записей при сортировке одного файла первого уровня. Но таких файлов {{Формула|f=\frac{B(R)}{b} }}. Перемножая их, получаем общее число операций.&lt;br /&gt;
&lt;br /&gt;
В конце концов всё сложится в один файл.&lt;br /&gt;
&lt;br /&gt;
{{Forward|l=ТОРА (9) - Лекция №13 - Оценки (продолжение)}}&lt;br /&gt;
&lt;br /&gt;
[[Категория:Теоретические основы реляционной алгебры (9 семестр)]]&lt;br /&gt;
[[Категория:Конспекты лекций и семинаров]]&lt;br /&gt;
[[Категория:Незаконченные конспекты]]&lt;/div&gt;</summary>
		<author><name>94.79.44.124</name></author>
	</entry>
	<entry>
		<id>https://iu5bmstu.ru/index.php?title=%D0%A2%D0%9E%D0%A0%D0%90_(9)_-_%D0%9B%D0%B5%D0%BA%D1%86%D0%B8%D1%8F_%E2%84%9612_-_%D0%9E%D1%86%D0%B5%D0%BD%D0%BA%D0%B8_(%D0%BF%D1%80%D0%BE%D0%B4%D0%BE%D0%BB%D0%B6%D0%B5%D0%BD%D0%B8%D0%B5)&amp;diff=2477</id>
		<title>ТОРА (9) - Лекция №12 - Оценки (продолжение)</title>
		<link rel="alternate" type="text/html" href="https://iu5bmstu.ru/index.php?title=%D0%A2%D0%9E%D0%A0%D0%90_(9)_-_%D0%9B%D0%B5%D0%BA%D1%86%D0%B8%D1%8F_%E2%84%9612_-_%D0%9E%D1%86%D0%B5%D0%BD%D0%BA%D0%B8_(%D0%BF%D1%80%D0%BE%D0%B4%D0%BE%D0%BB%D0%B6%D0%B5%D0%BD%D0%B8%D0%B5)&amp;diff=2477"/>
		<updated>2013-01-08T13:35:43Z</updated>

		<summary type="html">&lt;p&gt;94.79.44.124: /* Формулы оценки стоимости соединения NLJ */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Tabli4ka warning undone summary|text=&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;- схемы [[#Механизм сортировки таблиц | образования файлов со второго уровня и до последнего]].&amp;lt;br&amp;gt;А также не все [[#Формулы оценки стоимости соединения SMJ | формулы из раздела оценки SMJ]] верные.}}&lt;br /&gt;
{{Backward|l=ТОРА (9) - Лекция №11 - Оценки}}&lt;br /&gt;
Оригинал всего раздела, посвящённого оптимизации SQL-запросов, от самого [[Григорьев Ю.А. | Григорьева]] можно загрузить [http://yadi.sk/d/VjjMs6ww1HH2D здесь].&lt;br /&gt;
__TOC__&lt;br /&gt;
== Оптимизация SQL-запросов ==&lt;br /&gt;
&lt;br /&gt;
=== Методы соединения таблиц ===&lt;br /&gt;
&lt;br /&gt;
==== Метод вложенных циклов (NLJ, Nested Loop Join) ====&lt;br /&gt;
&lt;br /&gt;
Каждая запись первой соединяемой таблицы сравнивается с каждой записью второй соединяемой таблицы. В общем случае, условие сравнения может быть произвольным.&lt;br /&gt;
&lt;br /&gt;
[[Файл:9sTORAl11pic4.png|500px|center]]&lt;br /&gt;
&lt;br /&gt;
Зависит от:&lt;br /&gt;
&lt;br /&gt;
* используемого дерева соединения (но мы в дальнейшем всегда будем использовать левосторонние);&lt;br /&gt;
* назначения буферов ввода/вывода.&lt;br /&gt;
&lt;br /&gt;
[[Файл:9sTORAl12pic1.png|600px|center]]&lt;br /&gt;
&lt;br /&gt;
Если на 3 операции блоков будет больше {{Формула|f=b}}, то лишние сохраняются на диск.&lt;br /&gt;
&lt;br /&gt;
===== Формулы оценки стоимости соединения NLJ =====&lt;br /&gt;
&lt;br /&gt;
{{Формула|f=C^{JOIN} = C_{CPU} + C_{I/O} }}&lt;br /&gt;
&lt;br /&gt;
{{Формула|f=C_{CPU}=C_{CPU}\cdot T(Q_2)\cdot C_{comp} }}&lt;br /&gt;
&lt;br /&gt;
{{Формула|f=C_{I/O} = C_{I/O}(Q_2)\cdot\Bigl\lfloor\frac{B(Q_1)}{b}\Bigr\rfloor}}&lt;br /&gt;
&lt;br /&gt;
здесь:&lt;br /&gt;
&lt;br /&gt;
:{{Формула|f=T(Q_1)}}, {{Формула|f=T(Q_2)}} оценка числа записей в таблицах подзапросов {{Формула|f=Q_1}} и {{Формула|f=Q_2}};&lt;br /&gt;
:{{Формула|f=B(Q_1)}} - число блоков ввода/вывода для получения таблицы {{Формула|f=Q_1}};&lt;br /&gt;
:{{Формула|f=C_{I/O}(Q_2)}} - время ввода/вывода для получения таблицы {{Формула|f=Q_2}};&lt;br /&gt;
:{{Формула|f=b}} - число блоков в буферах 1 и 3 (&#039;&#039;из рисунка выше&#039;&#039;);&lt;br /&gt;
:{{Формула|f=C_{comp} }} - время сравнения двух кортежей из {{Формула|f=Q_1}} и {{Формула|f=Q_2}} в оперативной памяти;&lt;br /&gt;
&lt;br /&gt;
:неполные квадратные скобки означают округление с недостатком, так как одно чтение с диска учитывается в стоимости выбора записей из исходных таблиц.&lt;br /&gt;
&lt;br /&gt;
==== Метод сортировки слияния (SMJ, Sort Merge Join) ====&lt;br /&gt;
&lt;br /&gt;
Соединение двух таблиц этим методом выполняется по следующим шагам:&lt;br /&gt;
&lt;br /&gt;
# соединяемые таблицы сортируются по атрибуту соединения, будем обозначать его через {{Формула|f=a}};&lt;br /&gt;
# организуется вложенный цикл, где выполняется сравнение значения атрибута соединения в записях таблиц {{Формула|f=Q_1}} и {{Формула|f=Q_2}}. Условием соединения может быть только равенство атрибутов соединения.&lt;br /&gt;
&lt;br /&gt;
Рассмотрим пример реализации второго шага.&lt;br /&gt;
&lt;br /&gt;
Выполняется сравнение записей в таблицах {{Формула|f=Q_1}} и {{Формула|f=Q_2}}, на которые указывают указатели. Перемещение указателей выполняется следующим образом:&lt;br /&gt;
&lt;br /&gt;
* если выполняется условие {{Формула|f=&amp;lt;}}, то указатель перемещается в таблицу {{Формула|f=Q_1}};&lt;br /&gt;
* если выполняется условие {{Формула|f=&amp;gt;}}, то указатель перемещается в таблицу {{Формула|f=Q_2}};&lt;br /&gt;
* если выполняется условие {{Формула|f==}}, то результат соединения перемещается в выходной буфер, указатели не перемещаются и выполняется сравнение со следующей записью из таблицы {{Формула|f=Q_2}}.&lt;br /&gt;
&lt;br /&gt;
[[Файл:9sTORAl12pic2.png|500px|center]]&lt;br /&gt;
&lt;br /&gt;
Результат соединения {{Формула|f=Q_1}} и {{Формула|f=Q_2}} получается уже отсортированным.&lt;br /&gt;
&lt;br /&gt;
===== Формулы оценки стоимости соединения SMJ =====&lt;br /&gt;
&lt;br /&gt;
{{Формула|f=C_{CPU} = [C^{SORT}_{CPU}(Q_1)] + [C^{SORT}_{CPU}(Q_2)] + C^{JOIN}_{CPU}(Q_1, Q_2)}}&lt;br /&gt;
&lt;br /&gt;
{{Формула|f=C_{I/O} = [C^{SORT}_{I/O}(Q_1)] + [C^{SORT}_{I/O}(Q_2)] + C^{JOIN}_{I/O}(Q_1, Q_2)}}&lt;br /&gt;
&lt;br /&gt;
{{Формула|f=C^{SORT}_{CPU}(R) = T(R)\cdot\log_b\Bigl(\frac{T(R)}{\lceil B(R)/b\rceil}\Bigr)\cdot (C_{comp} + C_{move}) + \Bigl(\log_b B(R) - 1\Bigr)\cdot T(R)\cdot (b\cdot C_{comp} + C_{move}) }}&lt;br /&gt;
&lt;br /&gt;
{{Формула|f=C^{SORT}_{I/O}(R) = 2\cdot B(R)\cdot C_B}}&lt;br /&gt;
&lt;br /&gt;
Далее возможны варианты:&lt;br /&gt;
&lt;br /&gt;
* {{Формула|f=C^{JOIN}_{CPU}(Q_1, Q_2) = \Bigl(\Bigl(\frac{T(Q_2)}{Q_1, a} + 2\Bigr)\cdot T(Q_2) + T(Q_1)\cdot \Bigl(1 - \frac{I(Q_2, a)}{I(Q_1, a)}\Bigr)\Bigr)\cdot C_{comp} }}, если {{Формула|f=I(Q_1, a) &amp;gt; I(Q_2, a)}};&lt;br /&gt;
&lt;br /&gt;
* {{Формула|f=C^{JOIN}_{CPU}(Q_1, Q_2) = \Bigl(\Bigl(\frac{T(Q_1)}{Q_2, a} + 2\Bigr)\cdot T(Q_1) + T(Q_2)\cdot \Bigl(1 - \frac{I(Q_1, a)}{I(Q_2, a)}\Bigr)\Bigr)\cdot C_{comp} }}, если {{Формула|f=I(Q_2, a) &amp;gt; I(Q_1, a)}}.&lt;br /&gt;
&lt;br /&gt;
{{Формула|f=C^{JOIN}_{I/O} = [B(Q_1)] + [B(Q_2)] + \Bigl(\frac{T(Q_1)}{Q_2, a}\cdot \Bigl\lfloor \frac{B(Q_1)}{I(Q_2, a)\cdot b}\Bigr\rfloor\cdot b\cdot min(I(Q_1, a), I(Q_2, a)\Bigr)\cdot C_B}}&lt;br /&gt;
&lt;br /&gt;
здесь:&lt;br /&gt;
&lt;br /&gt;
:{{Формула|f=T(Q_1)}}, {{Формула|f=T(Q_2)}} - оценка числа записей в таблицах {{Формула|f=Q_1}} и {{Формула|f=Q_2}};&lt;br /&gt;
:{{Формула|f=B(Q_1)}}, {{Формула|f=B(Q_2)}} - оценка числа блоков в этих же таблицах;&lt;br /&gt;
:{{Формула|f=I(Q_1, a)}}, {{Формула|f=I(Q_2, a)}} - мощности атрибутов в соединении {{Формула|f=a}} тех же таблиц;&lt;br /&gt;
:{{Формула|f=b}} - число блоков в оперативной памяти, отводимое под сортировку этих таблиц, а также для выполнения соединения;&lt;br /&gt;
:{{Формула|f=C_{comp} }} - среднее время соединения двух кортежей из записей этих таблиц в оперативной памяти;&lt;br /&gt;
:{{Формула|f=C_{move} }} - время перемещения одной записи в оперативной памяти при сортировке;&lt;br /&gt;
:{{Формула|f=C_B}} - время чтения/записи одного блока на диск;&lt;br /&gt;
:верхние неполные квадратные скобки - округление с избытком;&lt;br /&gt;
:нижние неполные квадратные скобки - округление с недостатком;&lt;br /&gt;
:обычные квадратные скобки - необязательность, значит уже отсортировано.&lt;br /&gt;
&lt;br /&gt;
===== Механизм сортировки таблиц =====&lt;br /&gt;
&lt;br /&gt;
Механизм сортировки таблиц {{Формула|f=Q_1}} и {{Формула|f=Q_2}}:&lt;br /&gt;
# блоки таблицы {{Формула|f=R}} читаются в буфер и там сортируются. Получается файл, который сохраняется на диск;&lt;br /&gt;
# в буфер читаются ещё блоки.&lt;br /&gt;
&lt;br /&gt;
Таким образом, на диске будет сохранено несколько файлов, и в каждом записи будут отсортированы. Эти файлы образуют первый уровень.&lt;br /&gt;
&lt;br /&gt;
{{Формула|f=\frac{T(R)}{\lceil B(R) / b\rceil} }} - оценка числа записей в одном файле первого уровня.&lt;br /&gt;
&lt;br /&gt;
{{Формула|f=\frac{T(R)}{\lceil B(R) / b\rceil}\cdot log_2\frac{T(R)}{\lceil B(R) / b\rceil} }} - число операций сравнений и перемещений записей при сортировке одного файла первого уровня. Но таких файлов {{Формула|f=\frac{B(R)}{b} }}. Перемножая их, получаем общее число операций.&lt;br /&gt;
&lt;br /&gt;
В конце концов всё сложится в один файл.&lt;br /&gt;
&lt;br /&gt;
{{Forward|l=ТОРА (9) - Лекция №13 - Оценки (продолжение)}}&lt;br /&gt;
&lt;br /&gt;
[[Категория:Теоретические основы реляционной алгебры (9 семестр)]]&lt;br /&gt;
[[Категория:Конспекты лекций и семинаров]]&lt;br /&gt;
[[Категория:Незаконченные конспекты]]&lt;/div&gt;</summary>
		<author><name>94.79.44.124</name></author>
	</entry>
	<entry>
		<id>https://iu5bmstu.ru/index.php?title=%D0%A2%D0%9E%D0%A0%D0%90_(9)_-_%D0%9B%D0%B5%D0%BA%D1%86%D0%B8%D1%8F_%E2%84%966_-_%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%BF%D0%BE%D1%81%D1%82%D1%80%D0%BE%D0%B5%D0%BD%D0%B8%D1%8F_%D1%85%D0%BE%D1%80%D0%BE%D1%88%D0%B5%D0%B9_%D0%91%D0%94&amp;diff=2476</id>
		<title>ТОРА (9) - Лекция №6 - Алгоритм построения хорошей БД</title>
		<link rel="alternate" type="text/html" href="https://iu5bmstu.ru/index.php?title=%D0%A2%D0%9E%D0%A0%D0%90_(9)_-_%D0%9B%D0%B5%D0%BA%D1%86%D0%B8%D1%8F_%E2%84%966_-_%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%BF%D0%BE%D1%81%D1%82%D1%80%D0%BE%D0%B5%D0%BD%D0%B8%D1%8F_%D1%85%D0%BE%D1%80%D0%BE%D1%88%D0%B5%D0%B9_%D0%91%D0%94&amp;diff=2476"/>
		<updated>2013-01-08T13:11:56Z</updated>

		<summary type="html">&lt;p&gt;94.79.44.124: /* Нормальная форма Бойса-Кодда */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Третья нормальная форма ==&lt;br /&gt;
&lt;br /&gt;
=== Пример аномалий у 3НФ ===&lt;br /&gt;
&lt;br /&gt;
{{Формула|f=R = (A, B, C, D)}} и {{Формула|f=F = (A\rightarrow B, B\rightarrow A, AC\rightarrow D)}}&lt;br /&gt;
&lt;br /&gt;
Два ключа: {{Формула|f=AC}} и {{Формула|f=BC}}&lt;br /&gt;
&lt;br /&gt;
{{Формула|f=(AC)^+=ACBD}}, {{Формула|f=(BC)^+=BCAD}}&lt;br /&gt;
&lt;br /&gt;
{{Формула|f=A^+=AB}}, {{Формула|f=C^+ = C}}, {{Формула|f=B^+ = BA}}&lt;br /&gt;
&lt;br /&gt;
Покажем, что в этом случае {{Формула|f=R}} находится в 3НФ:&lt;br /&gt;
&lt;br /&gt;
1)&lt;br /&gt;
&lt;br /&gt;
:неключевой атрибут {{Формула|f=H}}, {{Формула|f=H = D}}&lt;br /&gt;
&lt;br /&gt;
2)&lt;br /&gt;
&lt;br /&gt;
:{{Формула|f=Y\rightarrow H}}, {{Формула|f=H\notin Y}}, {{Формула|f=Y = AC}}&lt;br /&gt;
&lt;br /&gt;
3)&lt;br /&gt;
&lt;br /&gt;
:{{Формула|f=X = BC}}, {{Формула|f=X = AC}}&lt;br /&gt;
&lt;br /&gt;
Нельзя подобрать нужную тройку, потому {{Формула|f=R}} находится в 3НФ. Однако, отношение всё равно обладает аномалиями:&lt;br /&gt;
* избыточности: наименование поставщика повторяется для каждой поставляемой делали;&lt;br /&gt;
* противоречивости при изменении наименования поставщика надо изменить его во всех записях, куда оно входит;&lt;br /&gt;
* включения: нельзя включить информацию о поставщике, если он ничего не поставляет;&lt;br /&gt;
* удаления: при удалении детали удаляется информация о поставщике.&lt;br /&gt;
&lt;br /&gt;
Для устранения этого вводится усиленная 3НФ - Бойса-Кодда.&lt;br /&gt;
&lt;br /&gt;
=== Нормальная форма Бойса-Кодда ===&lt;br /&gt;
&lt;br /&gt;
ФЗ {{Формула|f=X\rightarrow Y}} является неприводимой, если для любого подмножества {{Формула|f=Z\subset X}} выполняется {{Формула|f=Z\nrightarrow Y}} или {{Формула|f=Z\rightarrow Y\notin F^+}}&lt;br /&gt;
&lt;br /&gt;
Пусть есть отношение {{Формула|f=R}} и {{Формула|f=F}} включает в себя нетривиальные неприводимые ФЗ. Тогда отношение {{Формула|f=R}} &amp;lt;u&amp;gt;находится в нормальной форме Бойса-Кодда&amp;lt;/u&amp;gt;, если для любого {{Формула|f=X\rightarrow Y\in F}} =&amp;gt; {{Формула|f=X}} - ключ.&lt;br /&gt;
&lt;br /&gt;
Пример:&lt;br /&gt;
&lt;br /&gt;
{{Формула|f=R_1 = AB}}, {{Формула|f=F_1 = (A\rightarrow B, B\rightarrow A)}}, {{Формула|f=A}} - ключ, {{Формула|f=B}} - ключ.&lt;br /&gt;
&lt;br /&gt;
или&lt;br /&gt;
&lt;br /&gt;
{{Формула|f=R_2 = ACD}}, {{Формула|f=F_2 = (AC\rightarrow D)}}, {{Формула|f=AC}} - ключ.&lt;br /&gt;
&lt;br /&gt;
== Алгоритм синтеза &amp;quot;хорошей&amp;quot; БД ==&lt;br /&gt;
&lt;br /&gt;
Пусть {{Формула|f=U}} - универсальная схема отношения (множество всех атрибутов предметной области) и {{Формула|f=F}} - множество ФЗ.&lt;br /&gt;
&lt;br /&gt;
Перед выполнением алгоритма можно привести все ФЗ к одному атрибуту в правой части (по свойству декомпозиции) и удалить лишние ФЗ. Но это не обязательно.&lt;br /&gt;
&lt;br /&gt;
Алгоритм:&lt;br /&gt;
&lt;br /&gt;
# построить УНП для {{Формула|f=F}};&lt;br /&gt;
# если среди ФЗ в УНП нет ФЗ, включающей все атрибуты из {{Формула|f=U}}, то добавить в УНП тривиальную ФЗ {{Формула|f=U\rightarrow\varnothing}}. Выполнение этого шага почти всегда обеспечивает свойство соединения без потерь будущей схемы БД;&lt;br /&gt;
# привести все нетривиальные ФЗ из УНП к неприводимому виду (удалить лишние атрибуты в левых частях ФЗ);&lt;br /&gt;
# разбить полученное множество ФЗ УНП на классы эквивалентности. Две зависимости {{Формула|f=X_i\rightarrow Y_i}} и {{Формула|f=X_j\rightarrow Y_j}} будем называть эквивалентными, если {{Формула|f=X_iY_i = X_jY_j}}. Далее введём обозначение {{Формула|f=K_r = X_iY_i}} - множество атрибутов в левой и правой частях ФЗ {{Формула|f=r}}-того класса эквивалентности;&lt;br /&gt;
# построить граф иерархии полученных на предыдущем шаге классов эквивалентности (если это возможно). Правило построения: {{Формула|f=j}}-ый узел соединяем снизу с {{Формула|f=i}}-ым узлом, если {{Формула|f=K_j\subset K_i}}. В каждом узле записываются все ФЗ, соответствующего класса эквивалентности;&lt;br /&gt;
# из каждого класса эквивалентности в графе иерархии оставить только одну ФЗ. Правила выбора:&lt;br /&gt;
## удалить из класса эквивалентности лишние ФЗ;&lt;br /&gt;
## если в классе эквивалентности осталось больше одной ФЗ, то выбрать ФЗ с меньшим числом атрибутов в левой части;&lt;br /&gt;
## если у оставшихся ФЗ число атрибутов в левой части одинаково, то выбрать ту ФЗ, которая позволит редуцировать (вычеркнуть) число атрибутов справа у ФЗ, расположенных выше в графе иерархии;&lt;br /&gt;
## если в результате не удалось выбрать ни одной, то выбрать произвольную;&lt;br /&gt;
# редуцировать атрибуты справа в оставшихся ФЗ. Для этого просмотреть каждый путь снизу вверх в графе иерархии. Двигаясь по выбранному пути, выполнить следующие действия в каждом узле пути:&lt;br /&gt;
## пусть {{Формула|f=X\rightarrow Y}} - это ФЗ, записанная в данном узле. Каждый атрибут, принадлежащий правой части, вычеркнуть в правых частях ФЗ, расположенных в узлах этого пути по иерархии выше;&lt;br /&gt;
## для тривиальной ФЗ {{Формула|f=U\rightarrow\varnothing}} атрибуты вычёркиваются слева;&lt;br /&gt;
# исключить из рассмотрения ФЗ с пустой правой частью (кроме редуцированной ФЗ {{Формула|f=U\rightarrow\varnothing}}). Исключённые на этом шаге ФЗ являются лишними и выводятся из оставшихся;&lt;br /&gt;
# каждую оставшуюся в графе иерархий ФЗ {{Формула|f=V\rightarrow W}} заменить на множество {{Формула|f=VW}}. Получившееся множество схем отношений обозначить как {{Формула|f=\rho}};&lt;br /&gt;
# для полученной на предыдущем шаге схемы БД проверить:&lt;br /&gt;
## обладает ли она свойством соединия без потерь. Если не обладает, то добавить ключ универсальной схемы {{Формула|f=U}} в эту схему;&lt;br /&gt;
## обладает ли {{Формула|f=\rho}} свойством сохранения ФЗ. Если нет, то, использовать зависимости, не вошедшие в проекцию {{Формула|f=X\rightarrow Y\notin\Pi_{R_i}(F)}}, для построения новых схем отношений, то есть добавить в {{Формула|f=\rho}} {{Формула|f=XY}}.&lt;br /&gt;
&lt;br /&gt;
После выполнения всех шагов полученная схема {{Формула|f=\rho}}:&lt;br /&gt;
* обладает свойством соединения без потерь;&lt;br /&gt;
* обладает свойством сохранения ФЗ;&lt;br /&gt;
* находится в 3НФ или [[#Нормальная форма Бойса-Кодда | НФБК]];&lt;br /&gt;
* содержит минимальное число схем отношений.&lt;br /&gt;
&lt;br /&gt;
=== Пример ===&lt;br /&gt;
&lt;br /&gt;
{{Формула|f=U = (поставщик, фирма, деталь, количество) = (A, B, C, D)}}&lt;br /&gt;
&lt;br /&gt;
{{Формула|f=F = (A\rightarrow B, B\rightarrow A, AC\rightarrow D, BC\rightarrow D)}}&lt;br /&gt;
&lt;br /&gt;
Строим {{Формула|f=\rho}}:&lt;br /&gt;
&lt;br /&gt;
1)&lt;br /&gt;
&lt;br /&gt;
:{{Формула|f=УНП = (A\rightarrow B, B\rightarrow A, AC\rightarrow BD, BC\rightarrow AD)}}&lt;br /&gt;
&lt;br /&gt;
2)&lt;br /&gt;
&lt;br /&gt;
:пропускаем этот шаг, так как есть ФЗ (даже не одна), включающая все атрибуты из {{Формула|f=U}}&lt;br /&gt;
&lt;br /&gt;
3)&lt;br /&gt;
&lt;br /&gt;
:уменьшить число атрибутов не удаётся&lt;br /&gt;
&lt;br /&gt;
4)&lt;br /&gt;
&lt;br /&gt;
:1 класс: {{Формула|f=A\rightarrow B}}, {{Формула|f=B\rightarrow A}}, {{Формула|f=K_1 = AB}}&lt;br /&gt;
:2 класс: {{Формула|f=AC\rightarrow BD}}, {{Формула|f=BC\rightarrow AD}}, {{Формула|f=K_2 = ABCD}}&lt;br /&gt;
&lt;br /&gt;
5)&lt;br /&gt;
&lt;br /&gt;
:[[Файл:9sTORAl6pic1.png|link=Файл:9sTORAl6pic1.svg]]&lt;br /&gt;
&lt;br /&gt;
6)&lt;br /&gt;
&lt;br /&gt;
:для {{Формула|f=K_2}}:&lt;br /&gt;
&lt;br /&gt;
::&amp;lt;u&amp;gt;способ 1&amp;lt;/u&amp;gt; - как во [[ТОРА_(9)_-_Семинар_№2_-_Функциональные_зависимости#Выявление лишних ФЗ | втором семинаре]]&lt;br /&gt;
:::можно ли вывести {{Формула|f=AC\rightarrow BD\in(BC\rightarrow AD)^+}}?&lt;br /&gt;
:::{{Формула|f=(AC)^+=AC}}, {{Формула|f=BD\nsubseteq(AC)^+}}, значит нельзя&lt;br /&gt;
:::можно ли вывести {{Формула|f=BC\rightarrow AD\in(AC\rightarrow BD)^+}}?&lt;br /&gt;
:::{{Формула|f=(BC)^+=BC}}, {{Формула|f=AD\nsubseteq(BC)^+}}, значит нельзя&lt;br /&gt;
&lt;br /&gt;
::&amp;lt;u&amp;gt;способ 2&amp;lt;/u&amp;gt; - вычеркнуть из правых частей ФЗ рассматриваемых классов эквивалентностей общие  атрибуты. Если получаются ФЗ с пустой правой частью, то они являются лишними.&lt;br /&gt;
:::{{Формула|f=AC\rightarrow B}}&lt;br /&gt;
:::{{Формула|f=BC\rightarrow A}}&lt;br /&gt;
:::выше по иерархии ничего нет, выбираем  {{Формула|f=BC\rightarrow AD}}&lt;br /&gt;
&lt;br /&gt;
::нет лишних ФЗ, потому... &lt;br /&gt;
&lt;br /&gt;
:для {{Формула|f=K_1}}:&lt;br /&gt;
&lt;br /&gt;
{{Forward|l=ТОРА (9) - Лекция №7 - Алгоритм (продолжение)}}&lt;br /&gt;
&lt;br /&gt;
[[Категория:Теоретические основы реляционной алгебры (9 семестр)]]&lt;br /&gt;
[[Категория:Конспекты лекций и семинаров]]&lt;/div&gt;</summary>
		<author><name>94.79.44.124</name></author>
	</entry>
	<entry>
		<id>https://iu5bmstu.ru/index.php?title=%D0%A2%D0%9E%D0%A0%D0%90_(9)_-_%D0%9B%D0%B5%D0%BA%D1%86%D0%B8%D1%8F_%E2%84%961_-_%D0%9E%D0%BF%D0%B5%D1%80%D0%B0%D1%86%D0%B8%D0%B8_%D1%80%D0%B5%D0%BB%D1%8F%D1%86%D0%B8%D0%BE%D0%BD%D0%BD%D0%BE%D0%B9_%D0%B0%D0%BB%D0%B3%D0%B5%D0%B1%D1%80%D1%8B&amp;diff=2475</id>
		<title>ТОРА (9) - Лекция №1 - Операции реляционной алгебры</title>
		<link rel="alternate" type="text/html" href="https://iu5bmstu.ru/index.php?title=%D0%A2%D0%9E%D0%A0%D0%90_(9)_-_%D0%9B%D0%B5%D0%BA%D1%86%D0%B8%D1%8F_%E2%84%961_-_%D0%9E%D0%BF%D0%B5%D1%80%D0%B0%D1%86%D0%B8%D0%B8_%D1%80%D0%B5%D0%BB%D1%8F%D1%86%D0%B8%D0%BE%D0%BD%D0%BD%D0%BE%D0%B9_%D0%B0%D0%BB%D0%B3%D0%B5%D0%B1%D1%80%D1%8B&amp;diff=2475"/>
		<updated>2013-01-08T12:08:44Z</updated>

		<summary type="html">&lt;p&gt;94.79.44.124: /* Селекция */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Определения ==&lt;br /&gt;
&lt;br /&gt;
=== Схема отношения ===&lt;br /&gt;
&lt;br /&gt;
Это поименованная совокупность атрибутов.&lt;br /&gt;
&lt;br /&gt;
{{Формула|f=R = (A_1, ..., A_n)}}, где {{Формула|f=A_i}} - некоторый атрибут из домена отношения.&lt;br /&gt;
&lt;br /&gt;
{{Формула|f=R = (}}идентификатор поставщика, адрес, товар, цена{{Формула|f=)=(A_1, A_2, A_3, A_4)}}.&lt;br /&gt;
&lt;br /&gt;
Здесь {{Формула|f=(A_1, A_3)}} - ключ, определяющий запись.&lt;br /&gt;
&lt;br /&gt;
=== Степень схемы отношения ===&lt;br /&gt;
&lt;br /&gt;
Это количество атрибутов в схеме.&lt;br /&gt;
&lt;br /&gt;
Для {{Формула|f=R = (A_1, A_2, A_3, A_4)}} степень равна 4.&lt;br /&gt;
&lt;br /&gt;
=== Экземпляр отношения ===&lt;br /&gt;
&lt;br /&gt;
Это конкретная таблица с данной схемой отношения.&lt;br /&gt;
&lt;br /&gt;
{{Формула|f=R = (}}идентификатор поставщика, адрес, товар, цена{{Формула|f=)}}.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
 ! Идентификатор !! Адрес !! Товар !! Цена&lt;br /&gt;
 |- align=&amp;quot;center&amp;quot;&lt;br /&gt;
 | ОАО &amp;quot;Х&amp;quot; || Ленина, 2 || сахар || 40&lt;br /&gt;
 |- align=&amp;quot;center&amp;quot;&lt;br /&gt;
 | ОАО &amp;quot;У&amp;quot; || Комсомола, 25 || соль || 5&lt;br /&gt;
 |}&lt;br /&gt;
&lt;br /&gt;
=== Кортеж ===&lt;br /&gt;
&lt;br /&gt;
Любая одна строка в таблице экземпляра отношения.&lt;br /&gt;
&lt;br /&gt;
=== Схема БД ===&lt;br /&gt;
&lt;br /&gt;
{{Формула|f=A}} - множество всех атрибутов некоторой предметной области (универсальная схема отношения).&lt;br /&gt;
&lt;br /&gt;
{{Формула|f=R_1, ..., R_n}} - совокупность атрибутов.&lt;br /&gt;
&lt;br /&gt;
Тогда {{Формула|f=\rho=(R_1, ..., R_n)}} называется схемой БД.&lt;br /&gt;
&lt;br /&gt;
Пример:&lt;br /&gt;
&lt;br /&gt;
{{Формула|f=A = (A_1, A_2, A_3, A_4)}}&lt;br /&gt;
&lt;br /&gt;
и две схемы: {{Формула|f=R_1 = (A_1, A_2)$ и $R_2 = (A_1, A_3, A_4)}}&lt;br /&gt;
&lt;br /&gt;
Так как {{Формула|f=R_1\bigcup R_2 = A}}, то {{Формула|f=\rho = (R_1, R_2)}}.&lt;br /&gt;
&lt;br /&gt;
== Примеры схем БД ==&lt;br /&gt;
&lt;br /&gt;
=== Пример &amp;quot;плохой&amp;quot; схемы БД ===&lt;br /&gt;
&lt;br /&gt;
Пусть {{Формула|f=A = (}}идентификатор поставщика, адрес, товар, цена{{Формула|f=)}}&lt;br /&gt;
&lt;br /&gt;
и есть одна схема {{Формула|f=\rho = R_1 = A}}&lt;br /&gt;
&lt;br /&gt;
Данная схема БД обладает следующими недостатками (аномалиями):&lt;br /&gt;
* избыточность. Адрес поставщика повторяется для каждого поставляемого им товара;&lt;br /&gt;
* потенциальная противоречивость. Если у поставщика меняется адрес, то его необходимо изменить во всех кортежах, в которые он входит;&lt;br /&gt;
* аномалия включения кортежа. В выбранном отношении {{Формула|f=R}} пара атрибутов идентификатор-товар является ключом. При включении новой записи, атрибуты ключа не должны быть пустыми, поэтому в БД нельзя включить поставщика, если он в данный момент не поставляет товар;&lt;br /&gt;
* аномалия удаления. При удалении всех товаров, поставляемых поставщиком, теряется информация о самом поставщике.&lt;br /&gt;
Первопричиной этих недостатков является то, что {{Формула|f=R_1}} не находится в {{Википедия|Третья_нормальная_форма|3НФ}}&lt;br /&gt;
&lt;br /&gt;
=== Пример &amp;quot;хорошей&amp;quot; схемы БД ===&lt;br /&gt;
&lt;br /&gt;
Пусть {{Формула|f=A = (}}идентификатор поставщика, адрес, товар, цена{{Формула|f=)}}&lt;br /&gt;
&lt;br /&gt;
{{Формула|f=R_1 = (}}идентификатор, адрес{{Формула|f=)}}&lt;br /&gt;
&lt;br /&gt;
{{Формула|f=R_2 = (}}товар, цена{{Формула|f=)}}&lt;br /&gt;
&lt;br /&gt;
Схема {{Формула|f=\rho = (R_1, R_2)}} находится в 3НФ и не обладает перечисленными выше недостатками.&lt;br /&gt;
&lt;br /&gt;
== Основные операции реляционной алгебры ==&lt;br /&gt;
&lt;br /&gt;
=== Объединение отношений ===&lt;br /&gt;
&lt;br /&gt;
{{Формула|f=R=R_1\bigcup R_2}}&lt;br /&gt;
&lt;br /&gt;
Объединение отношений - это отношение, каждый кортеж которого принадлежит либо {{Формула|f=R_1}}, либо {{Формула|f=R_2}}.&lt;br /&gt;
{|&lt;br /&gt;
 |&lt;br /&gt;
 {| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
  ! !!{{Формула|f=A_1}} !! {{Формула|f=A_2}}&lt;br /&gt;
  |- align=&amp;quot;center&amp;quot;&lt;br /&gt;
  ! rowspan=&amp;quot;2&amp;quot; | {{Формула|f=R_1}} &lt;br /&gt;
  | 1 || 2&lt;br /&gt;
  |- align=&amp;quot;center&amp;quot;&lt;br /&gt;
  | 3 || 4&lt;br /&gt;
  |}&lt;br /&gt;
  | &lt;br /&gt;
 {| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
  ! !!{{Формула|f=A_1}} !! {{Формула|f=A_2}}&lt;br /&gt;
  |- align=&amp;quot;center&amp;quot;&lt;br /&gt;
  ! rowspan=&amp;quot;2&amp;quot; | {{Формула|f=R_2}} &lt;br /&gt;
  | 5 || 6&lt;br /&gt;
  |- align=&amp;quot;center&amp;quot;&lt;br /&gt;
  | 1 || 2&lt;br /&gt;
  |}&lt;br /&gt;
 |}&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
 ! !!{{Формула|f=A_1}} !! {{Формула|f=A_2}}&lt;br /&gt;
 |- align=&amp;quot;center&amp;quot;&lt;br /&gt;
 ! rowspan=&amp;quot;3&amp;quot; | {{Формула|f=R}} &lt;br /&gt;
 | 1 || 2&lt;br /&gt;
 |- align=&amp;quot;center&amp;quot;&lt;br /&gt;
 | 3 || 4&lt;br /&gt;
 |- align=&amp;quot;center&amp;quot;&lt;br /&gt;
 | 5 || 6&lt;br /&gt;
 |}&lt;br /&gt;
&lt;br /&gt;
Дублирование кортежей не допускается.&lt;br /&gt;
&lt;br /&gt;
=== Пересечение отношений ===&lt;br /&gt;
&lt;br /&gt;
{{Формула|f=R = R_1\bigcap R_2}}&lt;br /&gt;
&lt;br /&gt;
Пересечение отношений - это отношение, каждый кортеж которого принадлежит и {{Формула|f=R_1}}, и {{Формула|f=R_2}}&lt;br /&gt;
&lt;br /&gt;
{|&lt;br /&gt;
 |&lt;br /&gt;
 {| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
  ! !!{{Формула|f=A_1}} !! {{Формула|f=A_2}}&lt;br /&gt;
  |- align=&amp;quot;center&amp;quot;&lt;br /&gt;
  ! rowspan=&amp;quot;2&amp;quot; | {{Формула|f=R_1}} &lt;br /&gt;
  | 1 || 2&lt;br /&gt;
  |- align=&amp;quot;center&amp;quot;&lt;br /&gt;
  | 3 || 4&lt;br /&gt;
  |}&lt;br /&gt;
  | &lt;br /&gt;
 {| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
  ! !!{{Формула|f=A_1}} !! {{Формула|f=A_2}}&lt;br /&gt;
  |- align=&amp;quot;center&amp;quot;&lt;br /&gt;
  ! rowspan=&amp;quot;2&amp;quot; | {{Формула|f=R_2}} &lt;br /&gt;
  | 5 || 6&lt;br /&gt;
  |- align=&amp;quot;center&amp;quot;&lt;br /&gt;
  | 1 || 2&lt;br /&gt;
  |}&lt;br /&gt;
 |}&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
 ! !!{{Формула|f=A_1}} !! {{Формула|f=A_2}}&lt;br /&gt;
 |- align=&amp;quot;center&amp;quot;&lt;br /&gt;
 ! {{Формула|f=R}} &lt;br /&gt;
 | 1 || 2&lt;br /&gt;
 |}&lt;br /&gt;
&lt;br /&gt;
=== Разность отношений ===&lt;br /&gt;
&lt;br /&gt;
{{Формула|f=R = R_1 - R_2}}&lt;br /&gt;
&lt;br /&gt;
Разность отношений - это отношение, кортежи которого принадлежат {{Формула|f=R_1}} и не принадлежат {{Формула|f=R_2}}&lt;br /&gt;
&lt;br /&gt;
{|&lt;br /&gt;
 |&lt;br /&gt;
 {| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
  ! !!{{Формула|f=A_1}} !! {{Формула|f=A_2}}&lt;br /&gt;
  |- align=&amp;quot;center&amp;quot;&lt;br /&gt;
  ! rowspan=&amp;quot;2&amp;quot; | {{Формула|f=R_1}} &lt;br /&gt;
  | 1 || 2&lt;br /&gt;
  |- align=&amp;quot;center&amp;quot;&lt;br /&gt;
  | 3 || 4&lt;br /&gt;
  |}&lt;br /&gt;
  | &lt;br /&gt;
 {| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
  ! !!{{Формула|f=A_1}} !! {{Формула|f=A_2}}&lt;br /&gt;
  |- align=&amp;quot;center&amp;quot;&lt;br /&gt;
  ! rowspan=&amp;quot;2&amp;quot; | {{Формула|f=R_2}} &lt;br /&gt;
  | 5 || 6&lt;br /&gt;
  |- align=&amp;quot;center&amp;quot;&lt;br /&gt;
  | 1 || 2&lt;br /&gt;
  |}&lt;br /&gt;
 |}&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
 ! !!{{Формула|f=A_1}} !! {{Формула|f=A_2}}&lt;br /&gt;
 |- align=&amp;quot;center&amp;quot;&lt;br /&gt;
 ! {{Формула|f=R}} &lt;br /&gt;
 | 3 || 4&lt;br /&gt;
 |}&lt;br /&gt;
&lt;br /&gt;
=== Декартово произведение ===&lt;br /&gt;
&lt;br /&gt;
{{Формула|f=R, S}} - две схемы отношения со степенями {{Формула|f=k_1}} и {{Формула|f=k_2}}&lt;br /&gt;
&lt;br /&gt;
{{Формула|f=t = R \times S}}&lt;br /&gt;
&lt;br /&gt;
Декартово произведение - это отношение {{Формула|f=t}} со степенью {{Формула|f=k_1 + k_2}}, кортежи которого получаются {{Википедия|Конкатенация|конкатенацией}} кортежей из отношений {{Формула|f=R}} и {{Формула|f=S}}.&lt;br /&gt;
&lt;br /&gt;
{|&lt;br /&gt;
 |&lt;br /&gt;
 {| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
  ! !!{{Формула|f=A_1}} !! {{Формула|f=A_2}}&lt;br /&gt;
  |- align=&amp;quot;center&amp;quot;&lt;br /&gt;
  ! rowspan=&amp;quot;2&amp;quot; | {{Формула|f=R}} &lt;br /&gt;
  | 1 || 2&lt;br /&gt;
  |- align=&amp;quot;center&amp;quot;&lt;br /&gt;
  | 3 || 4&lt;br /&gt;
  |}&lt;br /&gt;
  | &lt;br /&gt;
 {| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
  ! !!{{Формула|f=A_1}} !! {{Формула|f=A_3}}&lt;br /&gt;
  |- align=&amp;quot;center&amp;quot;&lt;br /&gt;
  ! rowspan=&amp;quot;2&amp;quot; | {{Формула|f=S}} &lt;br /&gt;
  | 5 || 6&lt;br /&gt;
  |- align=&amp;quot;center&amp;quot;&lt;br /&gt;
  | 7 || 8&lt;br /&gt;
  |}&lt;br /&gt;
 |}&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
 ! !!{{Формула|f=R.A_2}} !! {{Формула|f=A_2}} !! {{Формула|f=S.A_1}} !! {{Формула|f=A_3}}&lt;br /&gt;
 |- align=&amp;quot;center&amp;quot;&lt;br /&gt;
 ! rowspan=&amp;quot;4&amp;quot; | {{Формула|f=t}} &lt;br /&gt;
 | 1 || 2 || 5 || 6&lt;br /&gt;
 |- align=&amp;quot;center&amp;quot;&lt;br /&gt;
 | 1 || 2 || 7 || 8&lt;br /&gt;
 |- align=&amp;quot;center&amp;quot;&lt;br /&gt;
 | 3 || 4 || 5 || 6&lt;br /&gt;
 |- align=&amp;quot;center&amp;quot;&lt;br /&gt;
 | 3 || 4 || 7 || 8&lt;br /&gt;
 |}&lt;br /&gt;
&lt;br /&gt;
=== Проекция ===&lt;br /&gt;
&lt;br /&gt;
{{Формула|f=t=\Pi_{A_{i1} ... A_{ik} }(R) }}&lt;br /&gt;
&lt;br /&gt;
Проекция - это отношение, каждый кортеж которого состоит из значений атрибутов {{Формула|f=A_{i1} ... A_{ik} }} исходного отношения {{Формула|f=R}}.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
 ! !! {{Формула|f=A_1}} !! {{Формула|f=A_2}} !! {{Формула|f=A_3}} !! {{Формула|f=A_4}}&lt;br /&gt;
 |- align=&amp;quot;center&amp;quot;&lt;br /&gt;
 ! rowspan=&amp;quot;4&amp;quot; | {{Формула|f=R}} &lt;br /&gt;
 | 1 || 2 || 3 || 4&lt;br /&gt;
 |- align=&amp;quot;center&amp;quot;&lt;br /&gt;
 | 7 || 8 || 9 || 10&lt;br /&gt;
 |- align=&amp;quot;center&amp;quot;&lt;br /&gt;
 | 3 || 4 || 5 || 6&lt;br /&gt;
 |- align=&amp;quot;center&amp;quot;&lt;br /&gt;
 | 3 || 4 || 7 || 6&lt;br /&gt;
 |}&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
 ! !!{{Формула|f=A_1}} !! {{Формула|f=A_4}}&lt;br /&gt;
 |- align=&amp;quot;center&amp;quot;&lt;br /&gt;
 ! rowspan=&amp;quot;3&amp;quot; | {{Формула|f=t = \Pi_{A_1, A_4}(R)}} &lt;br /&gt;
 | 1 || 4&lt;br /&gt;
 |- align=&amp;quot;center&amp;quot;&lt;br /&gt;
 | 7 || 10&lt;br /&gt;
 |- align=&amp;quot;center&amp;quot;&lt;br /&gt;
 | 3 || 6&lt;br /&gt;
 |}&lt;br /&gt;
&lt;br /&gt;
=== Селекция ===&lt;br /&gt;
&lt;br /&gt;
{{Формула|f=t = \sigma_F(R)}}&lt;br /&gt;
&lt;br /&gt;
Селекция - это отношение, каждый кортеж которого принадлежит исходному отношению {{Формула|f=R}} и удовлетворяет логическому условию {{Формула|f=F}}.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
 ! !!{{Формула|f=A_1}} !! {{Формула|f=A_2}}&lt;br /&gt;
 |- align=&amp;quot;center&amp;quot;&lt;br /&gt;
 ! rowspan=&amp;quot;3&amp;quot; | {{Формула|f=R}} &lt;br /&gt;
 | 1 || 2&lt;br /&gt;
 |- align=&amp;quot;center&amp;quot;&lt;br /&gt;
 | 9 || 8&lt;br /&gt;
 |- align=&amp;quot;center&amp;quot;&lt;br /&gt;
 | 3 || 3&lt;br /&gt;
 |}&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
 ! !!{{Формула|f=A_1}} !! {{Формула|f=A_2}}&lt;br /&gt;
 |- align=&amp;quot;center&amp;quot;&lt;br /&gt;
 ! rowspan=&amp;quot;2&amp;quot; | {{Формула|f=t = \sigma_{A_1\leq A_2}(R)}} &lt;br /&gt;
 | 1 || 2&lt;br /&gt;
 |- align=&amp;quot;center&amp;quot;&lt;br /&gt;
 | 3 || 3&lt;br /&gt;
 |}&lt;br /&gt;
&lt;br /&gt;
=== Естественное соединение ===&lt;br /&gt;
&lt;br /&gt;
{{Формула|f=t = R\bowtie S}}&lt;br /&gt;
&lt;br /&gt;
Определение этой операции следует из способа построения естественного соединения.&lt;br /&gt;
&lt;br /&gt;
{|&lt;br /&gt;
 | valign=&amp;quot;top&amp;quot; |&lt;br /&gt;
 {| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
  ! !!{{Формула|f=A_1}} !! {{Формула|f=A_2}} !! {{Формула|f=A_3}}&lt;br /&gt;
  |- align=&amp;quot;center&amp;quot;&lt;br /&gt;
  ! rowspan=&amp;quot;2&amp;quot; | {{Формула|f=R}} &lt;br /&gt;
  | 1 || 2 || 3&lt;br /&gt;
  |- align=&amp;quot;center&amp;quot;&lt;br /&gt;
  | 4 || 6 || 7&lt;br /&gt;
  |}&lt;br /&gt;
  | valign=&amp;quot;top&amp;quot; |&lt;br /&gt;
 {| class=&amp;quot;wikitable&amp;quot; valign=&amp;quot;top&amp;quot;&lt;br /&gt;
  ! !! {{Формула|f=A_1}} !! {{Формула|f=A_2}} !! {{Формула|f=A_4}} !! {{Формула|f=A_5}}&lt;br /&gt;
  |- align=&amp;quot;center&amp;quot;&lt;br /&gt;
  ! rowspan=&amp;quot;3&amp;quot; | {{Формула|f=S}} &lt;br /&gt;
  | 1 || 2 || 7 || 8&lt;br /&gt;
  |- align=&amp;quot;center&amp;quot;&lt;br /&gt;
  | 8 || 9 || 10 || 11&lt;br /&gt;
  |- align=&amp;quot;center&amp;quot;&lt;br /&gt;
  | 5 || 6 || 9 || 16&lt;br /&gt;
  |}&lt;br /&gt;
 |}&lt;br /&gt;
&lt;br /&gt;
Построение естественного соединения:&lt;br /&gt;
&lt;br /&gt;
:1) построить декартово произведение {{Формула|f=R\times S}}&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
 ! !! {{Формула|f=R.A_1}} !! {{Формула|f=R.A_2}} !! {{Формула|f=A_3}} !! {{Формула|f=S.A_1}} !! {{Формула|f=S.A_2}}!! {{Формула|f=A_4}} !! {{Формула|f=A_5}}&lt;br /&gt;
 |- align=&amp;quot;center&amp;quot;&lt;br /&gt;
 ! rowspan=&amp;quot;6&amp;quot; | {{Формула|f=t_1}} &lt;br /&gt;
 | 1 || 2 || 3 || 1 || 2 || 7 || 8&lt;br /&gt;
 |- align=&amp;quot;center&amp;quot;&lt;br /&gt;
 | 1 || 2 || 3 || 8 || 9 || 10 || 11&lt;br /&gt;
 |- align=&amp;quot;center&amp;quot;&lt;br /&gt;
 | 1 || 2 || 3 || 4 || 6 || 9 || 16&lt;br /&gt;
 |- align=&amp;quot;center&amp;quot;&lt;br /&gt;
 | 4 || 6 || 7 || 1 || 2 || 7 || 8&lt;br /&gt;
 |- align=&amp;quot;center&amp;quot;&lt;br /&gt;
 | 4 || 6 || 7 || 8 || 9 || 10 || 11&lt;br /&gt;
 |- align=&amp;quot;center&amp;quot;&lt;br /&gt;
 | 4 || 6 || 7 || 4 || 6 || 9 || 16&lt;br /&gt;
 |}&lt;br /&gt;
&lt;br /&gt;
:2) выбрать из этого произведения кортежи по условию {{Формула|f=R.A_{i1} = S.A_{i1} ... R.A_{ik} = S.A_{ik} }}, где {{Формула|f=A_1 = A_k}} - общие атрибуты в схемах отношений {{Формула|f=R}} и {{Формула|f=S}} (предполагается, что эти атрибуты занимают одинаковое положение в отношениях. Хотя не обязательно)&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
 ! !! {{Формула|f=R.A_1}} !! {{Формула|f=R.A_2}} !! {{Формула|f=A_3}} !! {{Формула|f=S.A_1}} !! {{Формула|f=S.A_2}}!! {{Формула|f=A_4}} !! {{Формула|f=A_5}}&lt;br /&gt;
 |- align=&amp;quot;center&amp;quot;&lt;br /&gt;
 ! rowspan=&amp;quot;2&amp;quot; | {{Формула|f=t_2}} &lt;br /&gt;
 | 1 || 2 || 3 || 1 || 2 || 7 || 8&lt;br /&gt;
 |- align=&amp;quot;center&amp;quot;&lt;br /&gt;
 | 4 || 6 || 7 || 4 || 6 || 9 || 16&lt;br /&gt;
 |}&lt;br /&gt;
&lt;br /&gt;
:3) удалить из полученного отношения {{Формула|f=S.A_{i1} ... S.A_{ik} }}, потому что они будут дублирующими.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
 ! !! {{Формула|f=R.A_1}} !! {{Формула|f=R.A_2}} !! {{Формула|f=A_3}} !! {{Формула|f=A_4}} !! {{Формула|f=A_5}}&lt;br /&gt;
 |- align=&amp;quot;center&amp;quot;&lt;br /&gt;
 ! rowspan=&amp;quot;2&amp;quot; | {{Формула|f=t_3}} &lt;br /&gt;
 | 1 || 2 || 3 || 7 || 8&lt;br /&gt;
 |- align=&amp;quot;center&amp;quot;&lt;br /&gt;
 | 4 || 6 || 7 || 9 || 16&lt;br /&gt;
 |}&lt;br /&gt;
&lt;br /&gt;
[[Категория:Теоретические основы реляционной алгебры (9 семестр)]]&lt;br /&gt;
[[Категория:Конспекты лекций и семинаров]]&lt;/div&gt;</summary>
		<author><name>94.79.44.124</name></author>
	</entry>
</feed>