<?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=91.76.160.54</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=91.76.160.54"/>
	<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/91.76.160.54"/>
	<updated>2026-04-29T22:23:51Z</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%A1%D0%B5%D0%BC%D0%B8%D0%BD%D0%B0%D1%80_%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=5733</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%A1%D0%B5%D0%BC%D0%B8%D0%BD%D0%B0%D1%80_%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=5733"/>
		<updated>2018-02-05T19:52:40Z</updated>

		<summary type="html">&lt;p&gt;91.76.160.54: /* Задача №8 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Операции реляционной алгебры и их связь с SQL.&lt;br /&gt;
&lt;br /&gt;
== Операторы SQL ==&lt;br /&gt;
&lt;br /&gt;
=== SELECT ===&lt;br /&gt;
&lt;br /&gt;
SELECT - выборка, DISTINCT - исключая.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=sql&amp;gt;SELECT [DISTINCT] * | атрибуты&lt;br /&gt;
FROM таблицы&lt;br /&gt;
WHERE условие&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== UPDATE ===&lt;br /&gt;
&lt;br /&gt;
UPDATE - обновление, изменение.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=sql&amp;gt;UPDATE таблица&lt;br /&gt;
SET атрибут = выражение&lt;br /&gt;
WHERE условие&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== INSERT ===&lt;br /&gt;
&lt;br /&gt;
INSERT - вставка, добавление новых записей.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=sql&amp;gt;INSERT&lt;br /&gt;
INTO таблица&lt;br /&gt;
записи&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== DELETE ===&lt;br /&gt;
&lt;br /&gt;
DELETE - удаление записей.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=sql&amp;gt;DELETE&lt;br /&gt;
FROM таблица&lt;br /&gt;
WHERE условие&amp;lt;/syntaxhighlight&amp;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=\rho=(S,P,SP)}}&lt;br /&gt;
&lt;br /&gt;
*{{Формула|f=S}} - поставщики.&lt;br /&gt;
**SN - номер поставщика;&lt;br /&gt;
**SF - фамилия;&lt;br /&gt;
**SS - статус;&lt;br /&gt;
**SG - город.&lt;br /&gt;
&lt;br /&gt;
*{{Формула|f=P}} - деталь.&lt;br /&gt;
** PN - номер детали, ключ;&lt;br /&gt;
** PF - название детали;&lt;br /&gt;
** PC - цена за единицу.&lt;br /&gt;
&lt;br /&gt;
*{{Формула|f=SP}} - поставка.&lt;br /&gt;
** SN - номер поставщика;&lt;br /&gt;
** PN - номер детали;&lt;br /&gt;
** kol - количество поставляемых деталей.&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=S}}&lt;br /&gt;
 ! SN || SF || SS || SG&lt;br /&gt;
 |- align=&amp;quot;center&amp;quot;&lt;br /&gt;
 | S1 || Иванов || 80 || Москва&lt;br /&gt;
 |- align=&amp;quot;center&amp;quot;&lt;br /&gt;
 | S2 || Петров || 40 || Самара&lt;br /&gt;
 |- align=&amp;quot;center&amp;quot;&lt;br /&gt;
 | S3 || Кротов || 100 || Москва&lt;br /&gt;
 |}&lt;br /&gt;
 |&lt;br /&gt;
 | valign=&amp;quot;top&amp;quot; |&lt;br /&gt;
 |&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
 |+ {{Формула|f=P}}&lt;br /&gt;
 ! PN || PF || PC&lt;br /&gt;
 |- align=&amp;quot;center&amp;quot;&lt;br /&gt;
 | P1 || болт || 20&lt;br /&gt;
 |- align=&amp;quot;center&amp;quot;&lt;br /&gt;
 | P2 || гайка || 25&lt;br /&gt;
 |- align=&amp;quot;center&amp;quot;&lt;br /&gt;
 | P3 || шайба || 10&lt;br /&gt;
 |- align=&amp;quot;center&amp;quot;&lt;br /&gt;
 | P4 || гайка || 30&lt;br /&gt;
 |}&lt;br /&gt;
 |&lt;br /&gt;
 | valign=&amp;quot;top&amp;quot; |&lt;br /&gt;
 |&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
 |+ {{Формула|f=SP}}&lt;br /&gt;
 ! SN || PN || kol&lt;br /&gt;
 |- align=&amp;quot;center&amp;quot;&lt;br /&gt;
 | S1 || P1 || 100&lt;br /&gt;
 |- align=&amp;quot;center&amp;quot;&lt;br /&gt;
 | S1 || P3 || 200&lt;br /&gt;
 |- align=&amp;quot;center&amp;quot;&lt;br /&gt;
 | S2 || P3 || 150&lt;br /&gt;
 |- align=&amp;quot;center&amp;quot;&lt;br /&gt;
 | S3 || P3 || 50&lt;br /&gt;
 |}&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Задачи ==&lt;br /&gt;
&lt;br /&gt;
=== Задача №1 ===&lt;br /&gt;
&lt;br /&gt;
Проекция. Найти города, где проживают поставщики.&lt;br /&gt;
&lt;br /&gt;
{{Формула|f=t=\Pi_{SG}(S)}}&lt;br /&gt;
&lt;br /&gt;
Получится:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
 ! SG&lt;br /&gt;
 |- align=&amp;quot;center&amp;quot;&lt;br /&gt;
 | Москва&lt;br /&gt;
 |- align=&amp;quot;center&amp;quot;&lt;br /&gt;
 | Самара&lt;br /&gt;
 |}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=sql&amp;gt;SELECT DISTINCT SG FROM S&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Задача №2 ===&lt;br /&gt;
&lt;br /&gt;
Селекция. Найти поставщиков со статусом больше 70.&lt;br /&gt;
&lt;br /&gt;
{{Формула|f=t=\sigma_{SS&amp;gt;70}(S)}}&lt;br /&gt;
&lt;br /&gt;
Получится:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
 ! SN || SF || SS || SG&lt;br /&gt;
 |- align=&amp;quot;center&amp;quot;&lt;br /&gt;
 | S1 || Иванов || 80 || Москва&lt;br /&gt;
 |- align=&amp;quot;center&amp;quot;&lt;br /&gt;
 | S3 || Кротов || 100 || Москва&lt;br /&gt;
 |}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=sql&amp;gt;SELECT * FROM S WHERE SS &amp;gt; 70&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Задача №3 ===&lt;br /&gt;
&lt;br /&gt;
Найти номера и фамилии поставщиков со статусом меньше 80.&lt;br /&gt;
&lt;br /&gt;
{{Формула|f=t=\Pi_{SN,SF}(\sigma_{SS&amp;lt;80}(S))}}&lt;br /&gt;
&lt;br /&gt;
Получится:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
 ! SN || SF&lt;br /&gt;
 |- align=&amp;quot;center&amp;quot;&lt;br /&gt;
 | S2 || Петров&lt;br /&gt;
 |}&lt;br /&gt;
 &lt;br /&gt;
&amp;lt;syntaxhighlight lang=sql&amp;gt;SELECT SN, SF&lt;br /&gt;
FROM S&lt;br /&gt;
WHERE SS &amp;lt; 80&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Задача №4 ===&lt;br /&gt;
 &lt;br /&gt;
Удалить все поставки поставщика с номером S1.&lt;br /&gt;
 &lt;br /&gt;
{{Формула|f=SP = SP - \sigma_{SN=S1}(SP)}}&lt;br /&gt;
 &lt;br /&gt;
Получится:&lt;br /&gt;
 &lt;br /&gt;
{|+SP | class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
 ! SN || PN || kol&lt;br /&gt;
 |- align=&amp;quot;center&amp;quot;&lt;br /&gt;
 | S2 || P3 || 150&lt;br /&gt;
 |- align=&amp;quot;center&amp;quot;&lt;br /&gt;
 | S3 || P3 || 50&lt;br /&gt;
 |}&lt;br /&gt;
 &lt;br /&gt;
&amp;lt;syntaxhighlight lang=sql&amp;gt;DELETE&lt;br /&gt;
FROM SP&lt;br /&gt;
WHERE SN = S1&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Задача №5 ===&lt;br /&gt;
 &lt;br /&gt;
Добавить в таблицу S новых поставщиков из таблицы SNEW.&lt;br /&gt;
 &lt;br /&gt;
{|+SNEW | class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
 ! SN || SF || SS || SG&lt;br /&gt;
 |- align=&amp;quot;center&amp;quot;&lt;br /&gt;
 | S4 || Петров || 30 || Тверь&lt;br /&gt;
 |- align=&amp;quot;center&amp;quot;&lt;br /&gt;
 | S5 || Сидоров || 50 || Тверь&lt;br /&gt;
 |}&lt;br /&gt;
 &lt;br /&gt;
{{Формула|f=S = SP\bigcup S}}&lt;br /&gt;
&lt;br /&gt;
Получится:&lt;br /&gt;
&lt;br /&gt;
{|+ таблица SNEW | class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
 ! SN || SF || SS || SG&lt;br /&gt;
 |- align=&amp;quot;center&amp;quot;&lt;br /&gt;
 | S1 || Иванов || 80 || Москва&lt;br /&gt;
 |- align=&amp;quot;center&amp;quot;&lt;br /&gt;
 | S2 || Петров || 40 || Самара&lt;br /&gt;
 |- align=&amp;quot;center&amp;quot;&lt;br /&gt;
 | S3 || Кротов || 100 || Москва&lt;br /&gt;
 |- align=&amp;quot;center&amp;quot;&lt;br /&gt;
 | S4 || Петров || 30 || Тверь&lt;br /&gt;
 |- align=&amp;quot;center&amp;quot;&lt;br /&gt;
 | S5 || Сидоров || 50 || Тверь&lt;br /&gt;
 |}&lt;br /&gt;
 &lt;br /&gt;
&amp;lt;syntaxhighlight lang=sql&amp;gt;INSERT&lt;br /&gt;
INTO S&lt;br /&gt;
SELECT * FROM SNEW&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Задача №6 ===&lt;br /&gt;
&lt;br /&gt;
Найти номера поставщиков, поставляющих детали по цене меньше 30.&lt;br /&gt;
&lt;br /&gt;
{{Формула|f=r = \sigma_{PC&amp;lt;30}(P)}}&lt;br /&gt;
&lt;br /&gt;
{{Формула|f=t = SP \bowtie_{PN} r }}&lt;br /&gt;
&lt;br /&gt;
Получится:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
 ! PN !! PF !! PC !! SN !! kol&lt;br /&gt;
 |- align=&amp;quot;center&amp;quot;&lt;br /&gt;
 | P1 || болт || 20 || S1 || 100&lt;br /&gt;
 |- align=&amp;quot;center&amp;quot;&lt;br /&gt;
 | P3 || шайба || 10 || S1 || 200&lt;br /&gt;
 |- align=&amp;quot;center&amp;quot;&lt;br /&gt;
 | P3 || шайба || 10 || S2 || 150&lt;br /&gt;
 |- align=&amp;quot;center&amp;quot;&lt;br /&gt;
 | P3 || шайба || 10 || S3 || 50&lt;br /&gt;
 |}&lt;br /&gt;
&lt;br /&gt;
{{Формула|f=z = \Pi_{SN}(t)}}&lt;br /&gt;
&lt;br /&gt;
Получится:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
 ! SN&lt;br /&gt;
 |- align=&amp;quot;center&amp;quot;&lt;br /&gt;
 | S1&lt;br /&gt;
 |- align=&amp;quot;center&amp;quot;&lt;br /&gt;
 | S2&lt;br /&gt;
 |- align=&amp;quot;center&amp;quot;&lt;br /&gt;
 | S3&lt;br /&gt;
 |}&lt;br /&gt;
 &lt;br /&gt;
&amp;lt;syntaxhighlight lang=sql&amp;gt;SELECT DISTINCT SN&lt;br /&gt;
FROM SP, P&lt;br /&gt;
WHERE PC &amp;lt; 30 AND SP.PN = P.PN&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Задача №7 ===&lt;br /&gt;
&lt;br /&gt;
Найти номера и фамилии поставщиков, поставляющих шайбы в количестве больше 100.&lt;br /&gt;
&lt;br /&gt;
{{Формула|f=w = \sigma_{PF=шайба}(P)}}&lt;br /&gt;
&lt;br /&gt;
{{Формула|f=t = w \bowtie_{PN}SP }}&lt;br /&gt;
&lt;br /&gt;
{{Формула|f=z = \sigma_{kol&amp;gt;100}(t)}}&lt;br /&gt;
&lt;br /&gt;
{{Формула|f=q = z \bowtie_{SN} S}}&lt;br /&gt;
&lt;br /&gt;
{{Формула|f=x = \Pi_{SN,SF}(q)}}&lt;br /&gt;
&lt;br /&gt;
Получится:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
 ! SN || SF&lt;br /&gt;
 |- align=&amp;quot;center&amp;quot;&lt;br /&gt;
 | S1 || Иванов&lt;br /&gt;
 |- align=&amp;quot;center&amp;quot;&lt;br /&gt;
 | S2 || Петров&lt;br /&gt;
 |}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=sql&amp;gt;SELECT SN, SF&lt;br /&gt;
FROM S, P, SP&lt;br /&gt;
WHERE PF = &#039;шайба&#039; AND kol &amp;gt; 100 AND P.PN = SP.PN AND SP.SN = S.SN&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Задача №8 ===&lt;br /&gt;
&lt;br /&gt;
Все поставщики переехали из Москвы в Питер. Модифицировать таблицу S.&lt;br /&gt;
&lt;br /&gt;
{{Формула|f=t = \sigma_{SS=Москва}(S)}}, получится:&lt;br /&gt;
 &lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
 ! SN || SF || SS || SG&lt;br /&gt;
 |- align=&amp;quot;center&amp;quot;&lt;br /&gt;
 | S1 || Иванов || 80 || Москва&lt;br /&gt;
 |- align=&amp;quot;center&amp;quot;&lt;br /&gt;
 | S3 || Кротов || 100 || Москва&lt;br /&gt;
 |}&lt;br /&gt;
 &lt;br /&gt;
{{Формула|f=f = \Pi_{SN,SF,SS}(t)}}, получится:&lt;br /&gt;
 &lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
 ! SN || SF || SS&lt;br /&gt;
 |- align=&amp;quot;center&amp;quot;&lt;br /&gt;
 | S1 || Иванов || 80&lt;br /&gt;
 |- align=&amp;quot;center&amp;quot;&lt;br /&gt;
 | S3 || Кротов || 100&lt;br /&gt;
 |}&lt;br /&gt;
 &lt;br /&gt;
Ввели новую таблицу spb:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
 !SG&lt;br /&gt;
 |- align=&amp;quot;center&amp;quot;&lt;br /&gt;
 | Санкт-Петербург&lt;br /&gt;
|}&lt;br /&gt;
 &lt;br /&gt;
{{Формула|f=m = f\times spb}}, получится:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
 ! SN || SF || SS || SG&lt;br /&gt;
 |- align=&amp;quot;center&amp;quot;&lt;br /&gt;
 | S1 || Иванов || 80 || Санкт-Петербург&lt;br /&gt;
 |- align=&amp;quot;center&amp;quot;&lt;br /&gt;
 | S3 || Кротов || 100 || Санкт-Петербург&lt;br /&gt;
 |}&lt;br /&gt;
&lt;br /&gt;
{{Формула|f=z = S - t}}, получится:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
 ! SN || SF || SS || SG&lt;br /&gt;
 |- align=&amp;quot;center&amp;quot;&lt;br /&gt;
 | S2 || Петров || 40 || Самара&lt;br /&gt;
 |}&lt;br /&gt;
 &lt;br /&gt;
{{Формула|f=S = m \bigcup z}}, получится:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
 ! SN || SF || SS || SG&lt;br /&gt;
 |- align=&amp;quot;center&amp;quot;&lt;br /&gt;
 | S1 || Иванов || 80 || Санкт-Петербург&lt;br /&gt;
 |- align=&amp;quot;center&amp;quot;&lt;br /&gt;
 | S3 || Кротов || 100 || Санкт-Петербург&lt;br /&gt;
 |- align=&amp;quot;center&amp;quot;&lt;br /&gt;
 | S2 || Петров || 40 || Самара&lt;br /&gt;
 |}&lt;br /&gt;
 &lt;br /&gt;
&amp;lt;syntaxhighlight lang=sql&amp;gt;&lt;br /&gt;
UPDATE S&lt;br /&gt;
SET SG=&#039;Санкт Петербург&#039;&lt;br /&gt;
WHERE SG=&#039;Москва&#039;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Категория:Теоретические основы реляционной алгебры (9 семестр)|С]]&lt;br /&gt;
[[Категория:Конспекты лекций и семинаров]]&lt;/div&gt;</summary>
		<author><name>91.76.160.54</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%9614_-_%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=5732</id>
		<title>ТОРА (9) - Лекция №14 - Оценки (продолжение)</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%9614_-_%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=5732"/>
		<updated>2018-02-05T16:15:55Z</updated>

		<summary type="html">&lt;p&gt;91.76.160.54: /* OptPlanReturn() */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&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;
==== Методы соединения таблиц ====&lt;br /&gt;
&lt;br /&gt;
===== Число кортежей, блоков и мощности атрибутов в соединениях =====&lt;br /&gt;
&lt;br /&gt;
Справедливы для [[ТОРА_(9)_-_Лекция_№12_-_Оценки_(продолжение)#Метод ложных циклов (NLJ) | NLJ]], [[ТОРА_(9)_-_Лекция_№12_-_Оценки_(продолжение)#Метод сортировки слияния (SMJ) | SMJ]] и [[ТОРА (9) - Лекция №13 - Оценки (продолжение)#Метод хешированных соединений (Hash Join) | HJ]].&lt;br /&gt;
&lt;br /&gt;
1) количество кортежей в соединении:&lt;br /&gt;
&lt;br /&gt;
:{{Формула|f=T(Q_1\bowtie Q_2) = \frac{T(Q_1)\cdot T(Q_2)}{max(I(Q_1, a), I(Q_2, a))} }}&lt;br /&gt;
&lt;br /&gt;
2) числов блоков:&lt;br /&gt;
&lt;br /&gt;
:{{Формула|f=B(Q_1\bowtie Q_2) = \Bigl\lceil\frac{T(Q_1\bowtie Q_2)}{JOIN}\Bigr\rceil}} - верхние неполные квадратные скобки означают округление с избытком; &lt;br /&gt;
&lt;br /&gt;
3) мощности атрибутов:&lt;br /&gt;
&lt;br /&gt;
:* атрибутов ({{Формула|f=a}}) в результирующей таблице:&lt;br /&gt;
::{{Формула|f=I(Q_1\bowtie Q_2, a) = min(I(Q_1, a), I(Q_2, a))}}&lt;br /&gt;
:* остальных атрибутов ({{Формула|f=b}}):&lt;br /&gt;
::два варианта:&lt;br /&gt;
::* {{Формула|f=I(Q_1\bowtie Q_2, b) = min(T(Q_1\bowtie Q_2, I(Q_1, b))}}, если {{Формула|f=b}} - атрибут таблицы {{Формула|f=Q_1}};&lt;br /&gt;
::* {{Формула|f=I(Q_1\bowtie Q_2, b) = min(T(Q_1\bowtie Q_2, I(Q_2, b))}}, если {{Формула|f=b}} - атрибут таблицы {{Формула|f=Q_2}}.&lt;br /&gt;
&lt;br /&gt;
===== Алгоритмы для поиска физического плана =====&lt;br /&gt;
&lt;br /&gt;
Алгоритмы описываются на псевдоязыке с заимствованиями из C++:&lt;br /&gt;
* комментарии обозначаются косыми:&lt;br /&gt;
:&amp;lt;code&amp;gt;// камент&amp;lt;/code&amp;gt;&lt;br /&gt;
* обращение к полям структуры через точку:&lt;br /&gt;
:&amp;lt;code&amp;gt;структура.поле&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====== Алгоритм поиска физического плана с минимальной стоимостью (для левостороннего дерева) ======&lt;br /&gt;
&lt;br /&gt;
&amp;lt;u&amp;gt;Вход:&amp;lt;/u&amp;gt; логический план выполнения запроса с таблицами {{Формула|f=R_1 .. R_n}} (декартово соединение таблиц).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;u&amp;gt;Выход:&amp;lt;/u&amp;gt; квазиоптимальный (потому что рассматриваем левосторонние деревья) план выполнения запроса.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font face=&amp;quot;Courier New&amp;quot;&amp;gt;&#039;&#039;&#039;@НАЧАЛО АЛГОРИТМА&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
ДЛЯ {{Формула|f=i = 1,n}}&lt;br /&gt;
&lt;br /&gt;
:{{Формула|f=AccessPlan(R_i)}}; // определение параметров подзапроса {{Формула|f=Q_i = \Pi_{A_i}(\Sigma_{f_i}(R_i))}}.&lt;br /&gt;
&lt;br /&gt;
КОНЕЦ ДЛЯ&lt;br /&gt;
&lt;br /&gt;
// поиск оптимального плана&lt;br /&gt;
&lt;br /&gt;
ДЛЯ {{Формула|f=i = 2,n}}&lt;br /&gt;
&lt;br /&gt;
:ДЛЯ всех подмножеств {{Формула|f=P\subset {Q_1..Q_n}, |P| = i}}&lt;br /&gt;
:// для {{Формула|f=i = 2}}&lt;br /&gt;
:// {{Формула|f=P = (Q_1, Q_2)}}, {{Формула|f=P = (Q_2, Q_3)}}, {{Формула|f=P = (Q_1, Q_3)}}&lt;br /&gt;
:// для {{Формула|f=i = 3}}&lt;br /&gt;
:// {{Формула|f=P = (Q_1, Q_2, Q_3)}} и так же все варианты комбинаций&lt;br /&gt;
::ДЛЯ всех таблиц {{Формула|f=Q_j\in P}}&lt;br /&gt;
:::{{Формула|f=JoinPlan(P - Q_j, Q_j)}} // {{Формула|f=(P - Q_j)\bowtie Q_j}}&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=OptPlanReturn({Q_1..Q_n})}}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;@КОНЕЦ АЛГОРИТМА&#039;&#039;&#039;&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====== Массив структур ======&lt;br /&gt;
&lt;br /&gt;
Процедуры из алгоритма выше:&lt;br /&gt;
* {{Формула|f=AccessPlan()}};&lt;br /&gt;
* {{Формула|f=JoinPlan()}};&lt;br /&gt;
* {{Формула|f=OptPlanReturn()}}.&lt;br /&gt;
&lt;br /&gt;
Процедуры алгоритма работают с массивом &#039;&#039;структур&#039;&#039;. Формат экземпляра структуры:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
 |- align=&amp;quot;center&amp;quot;&lt;br /&gt;
 | {{Формула|f=W}} || {{Формула|f=X}} || {{Формула|f=Y}} || {{Формула|f=Z}} || {{Формула|f=ZIO}} || {{Формула|f=V}}&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{{Формула|f=W}}:&lt;br /&gt;
:если мощность {{Формула|f=W &amp;gt; 1}}, то {{Формула|f=W\subset {Q_i} }}, {{Формула|f=W = X\bigcup Y}};&lt;br /&gt;
:если мощность {{Формула|f=W = 1}}, то {{Формула|f=W}} - это имя таблицы {Q_i}}}.&lt;br /&gt;
&lt;br /&gt;
{{Формула|f=X}}:&lt;br /&gt;
:{{Формула|f=X\subset {Q_i} }}, которые были использованы в качестве левого аргумента соединения.&lt;br /&gt;
&lt;br /&gt;
{{Формула|f=Y}}:&lt;br /&gt;
:имя таблицы {{Формула|f=Q_i}}, которая была использована в качестве правого аргумента соединения. Если мощность {{Формула|f=W = 1}}, то {{Формула|f=X}} и {{Формула|f=Y}} пустые.&lt;br /&gt;
&lt;br /&gt;
{{Формула|f=Z}}:&lt;br /&gt;
:если {{Формула|f=W &amp;gt; 1}}, {{Формула|f=Z}} - текущая стоимость выполнения плана, включающая стоимость выполнения подзапросов и промежуточных соединений;&lt;br /&gt;
:если {{Формула|f=W = 1}}, {{Формула|f=Z}} - оценка времени выполнения(?) {{Формула|f=Q_i}}.&lt;br /&gt;
&lt;br /&gt;
{{Формула|f=ZIO}}:&lt;br /&gt;
:составляющая {{Формула|f=Z}}, касающаяся ввода/вывода.&lt;br /&gt;
&lt;br /&gt;
{{Формула|f=V}}:&lt;br /&gt;
:опции. Включает в себя:&lt;br /&gt;
:1) число записей:&lt;br /&gt;
:* если мощность {{Формула|f=W &amp;gt; 1}}, то {{Формула|f=T(W)}} - число прогнозируемых записей;&lt;br /&gt;
:* если мощность {{Формула|f=W = 1}}, то {{Формула|f=T(Q_i)}} - оценка числа записей в подзапросе;&lt;br /&gt;
:2) {{Формула|f=B(W)}} - прогнозируемое число блоков;&lt;br /&gt;
:3) {{Формула|f={I(W, A_i)} }} - мощности атрибутов, по которым было выполнено или выполняется соединение;&lt;br /&gt;
:4) идентификатор:&lt;br /&gt;
:* если мощность {{Формула|f=W &amp;gt; 1}}, то {{Формула|f=k}} - идентификатор метода соединения таблиц;&lt;br /&gt;
:* если мощность {{Формула|f=W = 1}}, то {{Формула|f=k}} - идентификатор метода выбора записей из исходных таблиц.&lt;br /&gt;
&lt;br /&gt;
====== AccessPlan() ======&lt;br /&gt;
&lt;br /&gt;
&amp;lt;u&amp;gt;Вход:&amp;lt;/u&amp;gt; {{Формула|f=R_i}} - имя исходной таблицы.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;u&amp;gt;Выход:&amp;lt;/u&amp;gt; {{Формула|f=str[i]}} - заполненный экземпляр структуры (описанной выше).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font face=&amp;quot;Courier New&amp;quot;&amp;gt;&#039;&#039;&#039;@НАЧАЛО АЛГОРИТМА&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
// оценка стоимости выбора записей из {{Формула|f=R_i}} для различных методов&lt;br /&gt;
&lt;br /&gt;
// {{Формула|f=j = 1}} - TableScan&lt;br /&gt;
&lt;br /&gt;
// {{Формула|f=j = 2}} - IndexScan&lt;br /&gt;
&lt;br /&gt;
ДЛЯ {{Формула|f=i = 1, 2}}&lt;br /&gt;
:{{Формула|f=C_j = C_{CPU} + C_{I/O} }} // для разных {{Формула|f=j}} разные формулы из прошлых лекций&lt;br /&gt;
КОНЕЦ ДЛЯ&lt;br /&gt;
&lt;br /&gt;
// определение оптимального метода выбора записей из {{Формула|f=R_i}}&lt;br /&gt;
&lt;br /&gt;
{{Формула|f=С = min(C_1, C_2)}} // здесь {{Формула|f=C = C_k}} &lt;br /&gt;
&lt;br /&gt;
// заполнение экземпляра {{Формула|f=str[i]}}&lt;br /&gt;
&lt;br /&gt;
{{Формула|f=str[i] = }}&lt;br /&gt;
&lt;br /&gt;
{&lt;br /&gt;
:{{Формула|f={Q_i} }}, {{Формула|f=\varnothing}}, {{Формула|f=\varnothing}} // {{Формула|f=W}}, {{Формула|f=X}}, {{Формула|f=Y}}&lt;br /&gt;
:{{Формула|f=C}}, {{Формула|f=C_{I/O_k} }} // {{Формула|f=Z}}, {{Формула|f=ZIO}}&lt;br /&gt;
:{{Формула|f={T(Q_i), B(Q_i), {min(T(Q_i), I(R_i, A_i))}, k} }} // {{Формула|f=V}}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;@КОНЕЦ АЛГОРИТМА&#039;&#039;&#039;&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====== JoinPlan() ======&lt;br /&gt;
&lt;br /&gt;
&amp;lt;u&amp;gt;Вход:&amp;lt;/u&amp;gt; {{Формула|f=R = (P - Q_j)}}, {{Формула|f=S = Q}}.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;u&amp;gt;Выход:&amp;lt;/u&amp;gt; {{Формула|f=str[n]}}.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font face=&amp;quot;Courier New&amp;quot;&amp;gt;&#039;&#039;&#039;@НАЧАЛО АЛГОРИТМА&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
1)&lt;br /&gt;
&lt;br /&gt;
:// поиск в массиве структур {{Формула|f=str[]}} номеров экземпляров {{Формула|f=m_1}} и {{Формула|f=m_2}}, для которых {{Формула|f=str[m_1].W = R}} и {{Формула|f=str[m_2].W = S}}&lt;br /&gt;
&lt;br /&gt;
:// оценка стоимости соединения для различных методов&lt;br /&gt;
:// если {{Формула|f=i = 1}}, то NLJ&lt;br /&gt;
:// если {{Формула|f=i = 2}}, то SMJ&lt;br /&gt;
:// если {{Формула|f=i = 3}}, то HJ&lt;br /&gt;
:// {{Формула|f=k}} - выбор оптимального из этих трёх&lt;br /&gt;
&lt;br /&gt;
2)&lt;br /&gt;
&lt;br /&gt;
:ДЛЯ {{Формула|f=i = 1, 3}}&lt;br /&gt;
::{{Формула|f=C_i = C_{CPU_i} + C_{I/O_i} }} // для разных {{Формула|f=i}} разные формулы из предыдущих лекций&lt;br /&gt;
:КОНЕЦ ДЛЯ&lt;br /&gt;
&lt;br /&gt;
:{{Формула|f=C = min(C_1, C_2)}} // стоимость соединения {{Формула|f=R}} и {{Формула|f=S}}&lt;br /&gt;
&lt;br /&gt;
:{{Формула|f=C = str[m_1].Z + str[m_2].Z + C}}&lt;br /&gt;
&lt;br /&gt;
3)&lt;br /&gt;
&lt;br /&gt;
:// поиск {{Формула|f=str[n].W = P}}&lt;br /&gt;
:// а) если такого экземпляра не существует, то заполнить очередной пустой экземпляр {{Формула|f=n}}.&lt;br /&gt;
:// б) если такой экземпляр найден, то сравнить стоимость выполнения плана. И если {{Формула|f=str[n].Z &amp;gt; C}}, то перезаписать экземпляр {{Формула|f=n}}.&lt;br /&gt;
&lt;br /&gt;
:{{Формула|f=str[n] =}}&lt;br /&gt;
:{&lt;br /&gt;
::{{Формула|f=P}}, {{Формула|f=R}}, {{Формула|f=S}} // {{Формула|f=W}}, {{Формула|f=X}}, {{Формула|f=Y}}&lt;br /&gt;
::{{Формула|f=C}}, {{Формула|f=C_{I/O_k} }} // {{Формула|f=Z}}, {{Формула|f=ZIO}}&lt;br /&gt;
::{{Формула|f={T(P), B(P), {I(P, A_i)}_i, k} }} // {{Формула|f=V}}&lt;br /&gt;
:}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;@КОНЕЦ АЛГОРИТМА&#039;&#039;&#039;&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====== OptPlanReturn() ======&lt;br /&gt;
&lt;br /&gt;
&amp;lt;u&amp;gt;Вход:&amp;lt;/u&amp;gt; список таблиц {{Формула|f=Q_i = {Q_1..Q_n} }}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;u&amp;gt;Выход:&amp;lt;/u&amp;gt; вывод оптимального плана.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font face=&amp;quot;Courier New&amp;quot;&amp;gt;&#039;&#039;&#039;@НАЧАЛО АЛГОРИТМА&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
1)&lt;br /&gt;
&lt;br /&gt;
:// поиск в массиме структур {{Формула|f=str[]}} экземпляра, который {{Формула|f=str[i].W = Q}}&lt;br /&gt;
&lt;br /&gt;
:печать{{Формула|f=(Q}}, &amp;quot; = &amp;quot;, {{Формула|f=str[i].X}}, &amp;quot; {{Формула|f=\bowtie}} &amp;quot;, {{Формула|f=str[i].Y}}, &amp;quot; метод &amp;quot;, {{Формула|f=str[i].V.k)}}&lt;br /&gt;
&lt;br /&gt;
2)&lt;br /&gt;
&lt;br /&gt;
:// если поле {{Формула|f=str[i].X}} пусто, то выйти из алгоритма&lt;br /&gt;
:// иначе рекурсивно вызываем сами себя, {{Формула|f=OptPlanReturn(str[i].X)}} // вывод оптимального плана для левого аргумента соединения&lt;br /&gt;
&lt;br /&gt;
3)&lt;br /&gt;
&lt;br /&gt;
:{{Формула|f=OptPlanReturn(str[i].Y)}} // вывод метода выбора записей из правого аргумента соединения&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;@КОНЕЦ АЛГОРИТМА&#039;&#039;&#039;&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Категория:Теоретические основы реляционной алгебры (9 семестр)]]&lt;br /&gt;
[[Категория:Конспекты лекций и семинаров]]&lt;/div&gt;</summary>
		<author><name>91.76.160.54</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=5728</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=5728"/>
		<updated>2018-02-04T23:43:21Z</updated>

		<summary type="html">&lt;p&gt;91.76.160.54: /* Формулы оценки стоимости соединения SMJ */&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;
==== Методы соединения таблиц ====&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_2\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 \log_b 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_1)}{I(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_2)}{I(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)}{I(Q_1, a)}\cdot \Bigl\lfloor \frac{B(Q_2)}{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;
Таким образом, на диске будет сохранено несколько файлов, и в каждом записи будут отсортированы. Эти файлы образуют первый уровень. Каждый файл можно рассматривать как &#039;&#039;стек&#039;&#039; записей.&lt;br /&gt;
&lt;br /&gt;
В буфере из {{Формула|f=b}} блоков сравниваются первые записи сохранённых на предыдущем этапе файлов (то есть, {{Формула|f=b}} файлов, если все сразу сравнивать не можем, потому что их сильно много). Минимальное среди сравниваемых записей значение пишется в файл следующего уровня, а стек, из которого это значение взяли, поднимается.&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;
{{Forward|l=ТОРА (9) - Лекция №13 - Оценки (продолжение)}}&lt;br /&gt;
&lt;br /&gt;
[[Категория:Теоретические основы реляционной алгебры (9 семестр)]]&lt;br /&gt;
[[Категория:Конспекты лекций и семинаров]]&lt;/div&gt;</summary>
		<author><name>91.76.160.54</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=5727</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=5727"/>
		<updated>2018-02-04T23:34:39Z</updated>

		<summary type="html">&lt;p&gt;91.76.160.54: /* Формулы оценки стоимости соединения SMJ */&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;
==== Методы соединения таблиц ====&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_2\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 \log_b 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_1)}{I(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_2)}{I(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;
Таким образом, на диске будет сохранено несколько файлов, и в каждом записи будут отсортированы. Эти файлы образуют первый уровень. Каждый файл можно рассматривать как &#039;&#039;стек&#039;&#039; записей.&lt;br /&gt;
&lt;br /&gt;
В буфере из {{Формула|f=b}} блоков сравниваются первые записи сохранённых на предыдущем этапе файлов (то есть, {{Формула|f=b}} файлов, если все сразу сравнивать не можем, потому что их сильно много). Минимальное среди сравниваемых записей значение пишется в файл следующего уровня, а стек, из которого это значение взяли, поднимается.&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;
{{Forward|l=ТОРА (9) - Лекция №13 - Оценки (продолжение)}}&lt;br /&gt;
&lt;br /&gt;
[[Категория:Теоретические основы реляционной алгебры (9 семестр)]]&lt;br /&gt;
[[Категория:Конспекты лекций и семинаров]]&lt;/div&gt;</summary>
		<author><name>91.76.160.54</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%9610_-_%D0%9B%D0%BE%D0%B3%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%B8%D0%B9_%D0%B8_%D1%84%D0%B8%D0%B7%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%B8%D0%B9_%D0%BF%D0%BB%D0%B0%D0%BD_%D0%B7%D0%B0%D0%BF%D1%80%D0%BE%D1%81%D0%B0&amp;diff=5725</id>
		<title>ТОРА (9) - Лекция №10 - Логический и физический план запроса</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%9610_-_%D0%9B%D0%BE%D0%B3%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%B8%D0%B9_%D0%B8_%D1%84%D0%B8%D0%B7%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%B8%D0%B9_%D0%BF%D0%BB%D0%B0%D0%BD_%D0%B7%D0%B0%D0%BF%D1%80%D0%BE%D1%81%D0%B0&amp;diff=5725"/>
		<updated>2018-02-04T21:24:15Z</updated>

		<summary type="html">&lt;p&gt;91.76.160.54: /* Чтение записей из индекса и фильтрация */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Backward|l=ТОРА (9) - Лекция №9 - Оптимизация запросов}}&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;
==== Порядок выполнения запроса на логическом уровне ====&lt;br /&gt;
&lt;br /&gt;
Пример с предыдущей лекции: {{Формула|f=\Pi_{остаток}(\sigma_{R_1.н-c=R_2.н-с}(}}&amp;lt;span style=&amp;quot;background-color:#32CD32&amp;quot;&amp;gt;{{Формула|f=\Pi_{R_1.н-с}(\sigma_{R_1.к-п=3}(R_1))}}&amp;lt;/span&amp;gt;{{Формула|f=\times}}&amp;lt;span style=&amp;quot;background-color:#00BFFF&amp;quot;&amp;gt;{{Формула|f=\Pi_{R_2.н-с, остаток}(\sigma_{R_2.о&amp;gt;1500}(R_2))}}&amp;lt;/span&amp;gt;{{Формула|f=))}}&lt;br /&gt;
&lt;br /&gt;
Каждый из подзапросов - это промежуточные таблицы {{Формула|f=Q_1}} и {{Формула|f=Q_2}}.&lt;br /&gt;
&lt;br /&gt;
1)&lt;br /&gt;
&lt;br /&gt;
:{{Формула|f=Q_1}}:&lt;br /&gt;
:{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
 |- align=&amp;quot;center&amp;quot;&lt;br /&gt;
 | 102&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
:{{Формула|f=Q_2}}:&lt;br /&gt;
:{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
 |- align=&amp;quot;center&amp;quot;&lt;br /&gt;
 | 101 || 2000&lt;br /&gt;
 |- align=&amp;quot;center&amp;quot;&lt;br /&gt;
 | 102 || 3000&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
2)&lt;br /&gt;
&lt;br /&gt;
:соединение {{Формула|f=Q_1}} и {{Формула|f=Q_2}} (естественное соединение):&lt;br /&gt;
&lt;br /&gt;
::декартово произведение:&lt;br /&gt;
::{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
 ! {{Формула|f=R_{1_{ном.сч} } }} !! {{Формула|f=R_{2_{ном.сч} } }} !! {{Формула|f=R_{2_{ост} } }}&lt;br /&gt;
 |- align=&amp;quot;center&amp;quot;&lt;br /&gt;
 | 102 || 101 || 2000&lt;br /&gt;
 |- align=&amp;quot;center&amp;quot;&lt;br /&gt;
 | 102 || 102 || 3000&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
::соединение:&lt;br /&gt;
::{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
 ! {{Формула|f=R_{1_{ном.сч} } }} !! {{Формула|f=R_{2_{ном.сч} } }} !! {{Формула|f=R_{2_{ост} } }}&lt;br /&gt;
 |- align=&amp;quot;center&amp;quot;&lt;br /&gt;
 | 102 || 102 || 3000&lt;br /&gt;
|}&lt;br /&gt;
&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;
 | 3000&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Вот этот результат и передаётся от СУБД на рабочую станцию.&lt;br /&gt;
&lt;br /&gt;
А теперь предположим, что таблицы {{Формула|f=R_1}} и {{Формула|f=R_2}} находятся на разных серверах. В этом случае, подзапросы {{Формула|f=Q_1}} и {{Формула|f=Q_2}} после оптимизации на сервере-оптимизаторе преобразуются в &amp;lt;code&amp;gt;SELECT&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
{{Формула|f=Q_1}}:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
SELECT R1.ном.сч&lt;br /&gt;
FROM R1&lt;br /&gt;
WHERE R1.код.польз = 3;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Формула|f=Q_2}}:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
SELECT R2.ном.сч, R2.ост&lt;br /&gt;
FROM R2&lt;br /&gt;
WHERE R2.ост &amp;gt; 1500;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;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;
При построении оптимального физического плана СУБД выполняет следующие действия:&lt;br /&gt;
# Последовательно строится множество физических планов на основе [[ТОРА (9) - Лекция №9 - Оптимизация запросов#Логический план | логического плана]]. Эти физические планы отличаются следующим:&lt;br /&gt;
## методом выбора записей из исходных таблиц (методом реализации подзапросов);&lt;br /&gt;
## порядком соединения промежуточных таблиц {{Формула|f=Q_i}} (комбинация вариантов соединения нескольких таблиц);&lt;br /&gt;
## методом соединения таблиц (вложенными циклами, сортировкой слияния или ещё как);&lt;br /&gt;
# Для каждого физического плана оценивается его стоимость и выбирается план с наименьшей. В стоимости учитывается и процессорная составляющая, и составляющая времени ввода/вывода.&lt;br /&gt;
&lt;br /&gt;
==== Методы выбора записей из исходной таблицы ====&lt;br /&gt;
&lt;br /&gt;
===== Чтение всех записей и фильтрация =====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;TableScan + Filter&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Файл:9sTORAl10pic3.png|kink=9sTORAl10pic3.svg|right]]&lt;br /&gt;
&lt;br /&gt;
Формула стоимости:&lt;br /&gt;
&lt;br /&gt;
{{Формула|f=Cost_\Sigma = C_{CPU} + C_{IO} }}&lt;br /&gt;
&lt;br /&gt;
{{Формула|f=C_{CPU} = T(R)\cdot C_{filter} }}&lt;br /&gt;
&lt;br /&gt;
{{Формула|f=C_{IO} = B(R)\cdot C_B}}&lt;br /&gt;
&lt;br /&gt;
здесь:&lt;br /&gt;
:{{Формула|f=T(R)}} - общее количество записей в таблице {{Формула|f=R}};&lt;br /&gt;
:{{Формула|f=B(R)}} - число физических блоков в таблице {{Формула|f=R}};&lt;br /&gt;
:{{Формула|f=C_{filter} }} - среднее время фильтрации одной записи;&lt;br /&gt;
:{{Формула|f=C_B}} - время чтения/записи одного блока на диск.&lt;br /&gt;
&lt;br /&gt;
===== Чтение записей из индекса и фильтрация =====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;IndexScan + Filter&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Файл:9sTORAl10pic4.png|kink=9sTORAl10pic4.svg|right]]&lt;br /&gt;
&lt;br /&gt;
Формула стоимости:&lt;br /&gt;
&lt;br /&gt;
{{Формула|f=Cost_\Sigma = C_{CPU} + C_{IO} }}&lt;br /&gt;
&lt;br /&gt;
{{Формула|f=C_{CPU} = \frac{T(R) \cdot k}{I(R,a)}\cdot C_{filter} }}&lt;br /&gt;
&lt;br /&gt;
{{Формула|f=C_{IO} }} - как и в предыдущем методе, умножаем время чтения/записи на число записей в блоке индекса. Но тут два варианта:&lt;br /&gt;
# для кластеризованного: {{Формула|f=C_{IO} = \frac{B(Index(R,a)) \cdot k}{I(R,a)}\cdot C_B + \frac{B(R)\cdot k}{I(R,a)}\cdot C_B}}. В кластеризованном индексе последовательность значений в индексе и в таблице совпадает;&lt;br /&gt;
# для индекса без кластеризации {{Формула|f=C_{IO} = \frac{B(Index(R,a)) \cdot k}{I(R,a)}\cdot C_B + \frac{T(R)\cdot k}{I(R,a)}\cdot C_B}}. Последовательность в индексе и таблице не совпадает. Число в этом случае читаемых записей равно числу блоков. Или наоборот.&lt;br /&gt;
&lt;br /&gt;
здесь:&lt;br /&gt;
:{{Формула|f=T(R)}} - общее количество записей в таблице {{Формула|f=R}};&lt;br /&gt;
:{{Формула|f=B(R)}} - число физических блоков в таблице {{Формула|f=R}};&lt;br /&gt;
:{{Формула|f=I(R,a)}} - мощность индексируемого атрибута {{Формула|f=a}} таблицы {{Формула|f=R}} (число разных значений, исключая пустое множество);&lt;br /&gt;
:{{Формула|f=B(Index(R,a))}} - число блоков на листовом уровне индекса по атрибуту {{Формула|f=a}};&lt;br /&gt;
:{{Формула|f=C_{filter} }} - среднее время фильтрации одной записи;&lt;br /&gt;
:{{Формула|f=C_B}} - время чтения/записи одного блока на диск;&lt;br /&gt;
:{{Формула|f=k}} - мощность атрибута {{Формула|f=a}} в запросе (число разных значений, указанных в подзапросе {{Формула|f=y}}).&lt;br /&gt;
&lt;br /&gt;
Определение {{Формула|f=k}}:&lt;br /&gt;
* {{Формула|f=k = 1}}, если {{Формула|f=y}}: {{Формула|f=a = const}};&lt;br /&gt;
* {{Формула|f=k = n}}, если {{Формула|f=y}}: {{Формула|f=a}} &amp;lt;code&amp;gt;IN&amp;lt;/code&amp;gt; {{Формула|f=(C_1 ... C_n)}}, {{Формула|f=C_i = const}};&lt;br /&gt;
* {{Формула|f=k =}} диапазон значений, если {{Формула|f=y}}: {{Формула|f=a &amp;gt;= C_1}} &amp;lt;code&amp;gt;AND&amp;lt;/code&amp;gt; {{Формула|f=a &amp;lt;= C_2}};&lt;br /&gt;
* {{Формула|f=k =}} число атрибутов, удовлетворяющих образцу, если {{Формула|f=y}}: {{Формула|f=a}} &amp;lt;code&amp;gt;LIKE &#039;чтонить&#039;&amp;lt;/code&amp;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;
[[Файл:9sTORAl10pic1.png|kink=9sTORAl10pic1.svg]]&lt;br /&gt;
&lt;br /&gt;
==== Пример физического плана ====&lt;br /&gt;
&lt;br /&gt;
[[Файл:9sTORAl10pic2.png|kink=9sTORAl10pic2.svg]]&lt;br /&gt;
&lt;br /&gt;
Данный физический план реализуется следующим образом;&lt;br /&gt;
# для реализации подзапроса к {{Формула|f=R_1}} читается вся таблица, записи фильтруются по {{Формула|f=f_1}} и получаемая таблица является правым аргументов в операции соединения;&lt;br /&gt;
# из таблицы {{Формула|f=R_2}} выделяется подусловие {{Формула|f=y}} для индексируемого атрибута, а потом выполняется чтение записей, удовлетворяющих этому условию. Полученные записи фильтруются по {{Формула|f=f_2}} и получаемая таблица является левым аргументом в операции соединения.&lt;br /&gt;
&lt;br /&gt;
Как мы уже знаем, оптимизатор для каждого физического плана рассчитывает стоимость. Рассмотрим этот расчёт для данного примера: {{Формула|f= Cost_\Sigma =}}&amp;lt;span style=&amp;quot;background-color:#20B2AA&amp;quot;&amp;gt;{{Формула|f=Cost(TableScan(R_1), Filter(f_1, \Pi_{A_1}))}}&amp;lt;/span&amp;gt;{{Формула|f=+}}&amp;lt;span style=&amp;quot;background-color:#CD5C5C&amp;quot;&amp;gt;{{Формула|f=Cost(IndexScan(R_2, y), Filter(f_2, \Pi_{A_2}))}}&amp;lt;/span&amp;gt;{{Формула|f=+}}&amp;lt;span style=&amp;quot;background-color:#DAA520&amp;quot;&amp;gt;{{Формула|f=Cost(\bowtie)}}&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Каждая из {{Формула|f=Cost()}} учитывает и процессорную составляющую, и временную составляющую ввода-вывода.&lt;br /&gt;
&lt;br /&gt;
{{Forward|l=ТОРА (9) - Лекция №11 - Оценки}}&lt;br /&gt;
&lt;br /&gt;
[[Категория:Теоретические основы реляционной алгебры (9 семестр)]]&lt;br /&gt;
[[Категория:Конспекты лекций и семинаров]]&lt;/div&gt;</summary>
		<author><name>91.76.160.54</name></author>
	</entry>
</feed>