Лекция 6: Особенности выполнения запросов · 2019-09-05 ·...
TRANSCRIPT
Лекция 6:Лекция 6:Особенности выполнения Особенности выполнения
запросовзапросов
Лектор — Николаев В.В.Лектор — Николаев В.В.2017 уч. год2017 уч. год
0. Введение0. Введение
Курсовая работаКурсовая работа
1) представление предметной области (4.03.2017)
2) ER-модель (13.04.2017)
3) Даталогическая модель (06.05.2017)
4) Итоговое построение БД (01.06.2017)
Что должно быть:
● Индексы
● Триггеры, функции
● База данных должна быть заполнена данными
● Отчет, содержащий все предыдущие этапы
На защите могут быть вопросы по темам всех предыдущих этапов
4 этап КР4 этап КР
Лабораторная работа №3Лабораторная работа №3
Отчет должен содержать:
● Текст задания.
● SQL-код запросов.
● Планы выполнения для запросов 1,2.
● Описание индексов, полезных для выполнения запроса (запросы 1-7).
● Выводы.
1. Индексы1. Индексы
Способы повышения производительности
запросов:
● Использование индексов.
● Настройка физических параметров СУБД
(способ разделения пространства хранения
данных, стратегии работы с транзакциями и
т. д.).
Повышение Повышение производительности запросовпроизводительности запросов
Индекс SQL — структура, состоящая из всех
значений для группы из одного или нескольких
столбцов.
Каждое значение имеет указатель на строку в
таблице, где это значение встречается.
ИндексыИндексы
ИндексыИндексы
company_id emp_name salary
18 Ivan 123
25 Pavel 124
17 Peter 245
13 Sergey 235
25 Eugene 546
25 Vladimir 345
27 Vyacheslav 234
19 Leonid 123
23 Ivan 34
11 Peter 546
13 Pavel 345
17 Alex 234
emp_table
ИндексыИндексы
company_id emp_name salary
18 Ivan 123
25 Pavel 124
17 Peter 245
13 Sergey 235
25 Eugene 546
25 Vladimir 345
27 Vyacheslav 234
19 Leonid 123
23 Ivan 34
11 Peter 546
13 Pavel 345
17 Alex 234
emp_table
SELECT * FROM emp_table
WHERE company_id = 17
Как найти нужные строки?
ИндексыИндексы
company_id emp_name salary
18 Ivan 123
25 Pavel 124
17 Peter 245
13 Sergey 235
25 Eugene 546
25 Vladimir 345
27 Vyacheslav 234
19 Leonid 123
23 Ivan 34
11 Peter 546
13 Pavel 345
17 Alex 234
emp_table
SELECT * FROM emp_table
WHERE company_id = 17
Перебираем все по очереди!
ИндексыИндексы
company_id emp_name salary
18 Ivan 123
25 Pavel 124
17 Peter 245
13 Sergey 235
25 Eugene 546
25 Vladimir 345
27 Vyacheslav 234
19 Leonid 123
23 Ivan 34
11 Peter 546
13 Pavel 345
17 Alex 234
emp_tableindex
11
13
13
17
17
18
19
23
25
25
25
27
ИндексыИндексы
company_id emp_name salary
18 Ivan 123
25 Pavel 124
17 Peter 245
13 Sergey 235
25 Eugene 546
25 Vladimir 345
27 Vyacheslav 234
19 Leonid 123
23 Ivan 34
11 Peter 546
13 Pavel 345
17 Alex 234
emp_tableindex
11
13
13
17
17
18
19
23
25
25
25
27
SELECT * FROM emp_table
WHERE company_id = 17
ИндексыИндексы
company_id emp_name salary
18 Ivan 123
25 Pavel 124
17 Peter 245
13 Sergey 235
25 Eugene 546
25 Vladimir 345
27 Vyacheslav 234
19 Leonid 123
23 Ivan 34
11 Peter 546
13 Pavel 345
17 Alex 234
emp_tableindex
11
13
13
17
17
18
19
23
25
25
25
27
SELECT * FROM emp_table
WHERE company_id = 17
ИндексыИндексы
company_id emp_name salary
18 Ivan 123
25 Pavel 124
17 Peter 245
13 Sergey 235
25 Eugene 546
25 Vladimir 345
27 Vyacheslav 234
19 Leonid 123
23 Ivan 34
11 Peter 546
13 Pavel 345
17 Alex 234
emp_tableindex
11
13
13
17
17
18
19
23
25
25
25
27
SELECT * FROM emp_table
WHERE company_id = 17
ИндексыИндексы
company_id emp_name salary
18 Ivan 123
25 Pavel 124
17 Peter 245
13 Sergey 235
25 Eugene 546
25 Vladimir 345
27 Vyacheslav 234
19 Leonid 123
23 Ivan 34
11 Peter 546
13 Pavel 345
17 Alex 234
emp_tableindex
11
13
13
17
17
18
19
23
25
25
25
27
SELECT * FROM emp_table
WHERE company_id = 17
Индексы работают неявно:
● При выполнении запроса СУБД определяет,
какие индексы нужно использовать.
● В рамках того или иного запроса СУБД может
не использовать индекс.
ИндексыИндексы
Индексы создаются по таблицам для ускорения операций, включающих:
● предложения WHERE и JOIN
● определение значений MIN() или MAX() по индексированному столбцу;
● сортировку и группировку столбцов таблицы
Правила работы с индексамиПравила работы с индексами
● Индекс занимает место.
● При изменении/удалении содержимого
индексированного столбца/при добавлении
новой строки индекс необходимо обновлять. Эти
действия замедляют операции.
● Индексы неэффективны, если в таблице мало
строк.
Недостатки индексовНедостатки индексов
● Какие операции будут применяться к таблицам:
запрос данных или обновление таблицы?
● Какие столбцы и как часто будут
использоваться в предикатах?
● Как часто столбцы таблиц будут использоваться
в соединениях (join)?
Стратегии примененияСтратегии применения
● B-tree
● Hash
● GiST
● SP-GiST
● GIN
● BRIN
Индексы в PostgreSQLИндексы в PostgreSQL
CREATE INDEX index_name
ON table_name (column_name);
CREATE INDEX index_name
ON table_name (column1_name, column2_name);
Создание индексов (1)Создание индексов (1)
CREATE INDEX index_name ON table_name USING
btree(column1, column2);
Создание индексов (2)Создание индексов (2)
B-treeB-tree
● Дерево — связный ациклический граф.
● Связность — означает наличие путей между
любой парой вершин;
● Ацикличность — отсутствие циклов и то, что
между парами вершин имеется только по
одному пути.
B-treeB-tree
B-treeB-tree
● B-дерево — структура данных, дерево поиска. С
точки зрения логического представления —
сбалансированное, сильно ветвистое дерево.
● Сбалансированность — длина любых двух путей от
корня до листьев различается не более, чем на
единицу.
● Ветвистость дерева — свойство каждого узла
дерева ссылаться на большое число узлов-
потомков.
B-tree indexB-tree index
● B-tree (balanced tree index) — индекс
сгруппированный по листьям
сбалансированного дерева
ПримерПример
SELECT * FROM emp_table
WHERE company_id >= 53
company_id emp_name salary
41 Ivan 123
24 Pavel 124
65 Peter 245
36 Sergey 235
48 Eugene 546
55 Vladimir 345
59 Vyacheslav 234
51 Leonid 123
53 Ivan 34
54 Peter 546
22 Pavel 345
65 Alex 234
emp_table
B-tree indexB-tree index
B-tree indexB-tree index
● Значения (ключи) внутри каждого узла
отсортированы.
● Алгоритм сбалансирован: ключи равномерно
распределены по узлам, что позволяет
минимизировать количество переходов.
● Полезен при использовании совместно с =, >,
>=, <, <=, BETWEEN и подобными
операторами.
Hash-indexHash-index
Для построения такого индекса используется
хэш-функция
Hash-indexHash-index
● Очень эффективны, когда используется
прямое сравнение (на attr — hash index):
... WHERE attr = 1
● Но индекс не будет применен, если:
… WHERE attr = 1 OR A=10
2. Выполнение запросов2. Выполнение запросов
Язык SQL декларативен:
● В запросах указывается, какими должны быть
данные, которые необходимо получить.
● Не говорится о том, как система должна
выполнить запрос.
Зачем это нужно?Зачем это нужно?
● Чтобы выполнить SQL-запрос необходимо
построить программу — план выполнения
запроса.
● Таких программ может быть несколько.
План выполнения запросаПлан выполнения запроса
СУБД должна:
● уметь построить все возможные программы,
результаты которых соответствуют заданному
SQL-запросу
● выбрать программу, выполнение которой
наиболее эффективно
План выполнения запросаПлан выполнения запроса
Критерий: оценочная стоимость выполнения
запроса по данному плану.
Компоненты оцениваемой стоимости:
● число обменов с устройствами внешней
памяти, которые потребуются при выполнении
плана запроса;
● среднее время обмена;
Выбор плана выполнения Выбор плана выполнения запросазапроса
Обозначения (реляц. алгебра)Обозначения (реляц. алгебра)
При построении плана выполнения запроса нам понадобится ряд обозначений из реляционной алгебры:
● R, S — отношения (таблицы)
● R ⋈θ S — соединение (тета-соединение), JOIN
ОбозначенияОбозначения
● σφ — операция выборки, применяется к отношению (σφ(R)) и определяет результирующее отношение, которое содержит только те строки (кортежи), которые удовлетворяют заданному условию (предикату).
SELECT * FROM STUDENTS WHERE
STUDENTS.GROUP = '3100' AND
STUDENTS.ID >= 150000;
σSTUDENTS.GROUPΛSTUDENTS.ID(STUDENTS)
ОбозначенияОбозначения
R ⋈θ S — соединение (тета-соединение), JOIN
R ⋈θ S = σθ(R X S)
ОбозначенияОбозначения
● π — проекция, применяется к отношению R (πattr(R)) и определяет новое отношение, содержащее только те атрибуты из R, которые были указаны в проекции:
SELECT attr1, attr2 FROM R …
πattr1, att2(R)
ЗаконыЗаконы
R ⋈θ S ≡ S ⋈θ R (коммутативность)
R ⋈θ θ (S ⋈φ T ) ≡ (R ⋈θ S) ⋈φ T (ассоциативность)
σθ∧φ (R) ≡ σθ (σφ (R))
σφ(R ⋈θ S) ≡ (σφ(R) ⋈θ S), если φ относится к атрибутам R
πA (R ⋈θ S) ≡ πA(π(A∪B)∩ attrs(R)(R) ⋈θ S), B — атрибуты из условия θ
ПримерПример
SELECT * FROM STUDENTS
JOIN EXAMS ON STUDENTS.ID = EXAM.STUD_ID
WHERE
STUDENTS.GROUP = '3100' AND
STUDENTS.ID >= 150000;
Какие планы выполнения запроса возможны?
ПримерПример
Расчет стоимости плана Расчет стоимости плана выполнения запросавыполнения запроса
Можно выделить 3 основных составляющих:
● Чтение входных или промежуточных таблиц.
● Запись промежуточных данных (материализация — результат сохраняется во временных отношениях после выполнения одной операции для обработки следующей операцией).
● Сортировка результата (DISTINCT).
ПримерПример
Типы деревьев реляц. алгебрыТипы деревьев реляц. алгебры
а) левостороннее
б) смешанное линейное
в) нелинейное (куст)
R1 ⋈ R2 ⋈ R3 ⋈ R4
Левосторонние деревьяЛевосторонние деревья
● Обычно оптимизаторы запросов в СУБД рассматривают только левосторонние деревья, тк:
1) Необходимо сократить число планов для анализа.
2) Планы, основанные на левосторонних деревьях позволяют избежать материализации, используя конвейерную обработку данных.
Конвейерная обработка данныхКонвейерная обработка данных
● Конв. обр. данных — передача результатов одной операции на обработку другой без создания временных отношений (для хранения промежуточных результатов).
● Для планов, в которых большинство операций происходят в конвейере:
при расчете стоимости плана выполнения запроса отпадает необходимость в учете стоимости записи и последующего чтения промежуточных таблиц.
Конвейерная обработкаКонвейерная обработка
SELECT * FROM STUDENTSJOIN EXAMS ON STUDENTS.ID = EXAM.STUD_IDWHERE STUDENTS.GROUP = '3100' AND STUDENTS.ID >= 150000;
σSID>=150000∩GROUP=`3100`(STUDENTS)
σGROUP=`3100`(σSID>=150000(STUDENTS))
(Конвейерная обработка)
Влияние индексов (пример) — Влияние индексов (пример) — конвейерная обработкаконвейерная обработка
SELECT * FROM STUDENTSJOIN EXAMS ON STUDENTS.ID = EXAM.STUD_IDWHERE STUDENTS.GROUP = '3100' AND STUDENTS.ID >= 150000;
σSID>=150000∩GROUP=`3100`(STUDENTS)
σGROUP=`3100`(σSID>=150000(STUDENTS))
(Конвейерная обработка)
Влияние индексов (пример) — Влияние индексов (пример) — конвейерная обработкаконвейерная обработка
Индекс:
На STUDENT.GROUP или на STUDENT.ID
Если использовать план с этого слайда:
Hash index на STUDENT.GROUP
(оба индекса ставить не имеет смысла из-за конв.
обработки)
Советы при построении планаСоветы при построении плана
● Использовать конвейерную обработку (левосторонние планы, избегать блокирующих операций).
● Делать выборку как можно раньше.
● Делать проекции раньше.
● Цель: уменьшение размеров промежуточных данных.
Самостоятельно (!)Самостоятельно (!)
● Нормализация (1-3 Нормальные формы).
Введение в реляционные базы данных / В. В. Кириллов, Г. Ю. Громов, глава 11 (стр. 211-223)
При подготовке презентации использовались материалы из:
● Введение в реляционные базы данных / В. В. Кириллов, Г. Ю. Громов, Издательство: BHV, 2009 г.
● Документация PostgreSQL:
https://www.postgresql.org/docs/9.4/static/https://postgrespro.ru/docs/postgresql/9.4/index.html
ЛитератураЛитература
Лицензия к документации PostgreSQL:Юридическое уведомлениеPostgreSQL © 1996-2015 — PostgreSQL Global Development Group.Postgres95 © 1994-5 — Регенты университета Калифорнии.
Настоящим разрешается использование, копирование, модификация и распространение данного программного продукта и документации для любых целей, бесплатно и без письменного разрешения, при условии сохранения во всех копиях приведённого выше уведомления об авторских правах и данного параграфа вместе с двумя последующими параграфами.
УНИВЕРСИТЕТ КАЛИФОРНИИ НИ В КОЕЙ МЕРЕ НЕ НЕСЁТ ОТВЕТСТВЕННОСТИ ЗА ПРЯМОЙ, КОСВЕННЫЙ, НАМЕРЕННЫЙ, СЛУЧАЙНЫЙ ИЛИ СПРОВОЦИРОВАННЫЙ УЩЕРБ, В ТОМ ЧИСЛЕ ПОТЕРЯННЫЕ ПРИБЫЛИ, СВЯЗАННЫЙ С ИСПОЛЬЗОВАНИЕМ ЭТОГО ПРОГРАММНОГО ПРОДУКТА И ЕГО ДОКУМЕНТАЦИИ, ДАЖЕ ЕСЛИ УНИВЕРСИТЕТ КАЛИФОРНИИ БЫЛ УВЕДОМЛЁН О ВОЗМОЖНОСТИ ТАКОГО УЩЕРБА.
УНИВЕРСИТЕТ КАЛИФОРНИИ ЯВНЫМ ОБРАЗОМ ОТКАЗЫВАЕТСЯ ОТ ЛЮБЫХ ГАРАНТИЙ, В ЧАСТНОСТИ ПОДРАЗУМЕВАЕМЫХ ГАРАНТИЙ КОММЕРЧЕСКОЙ ВЫГОДЫ ИЛИ ПРИГОДНОСТИ ДЛЯ КАКОЙ-ЛИБО ЦЕЛИ. НАСТОЯЩИЙ ПРОГРАММНЫЙ ПРОДУКТ ПРЕДОСТАВЛЯЕТСЯ В ВИДЕ "КАК ЕСТЬ", И УНИВЕРСИТЕТ КАЛИФОРНИИ НЕ ДАЁТ НИКАКИХ ОБЯЗАТЕЛЬСТВ ПО ЕГО ОБСЛУЖИВАНИЮ, ПОДДЕРЖКЕ, ОБНОВЛЕНИЮ, УЛУЧШЕНИЮ ЛИ МОДИФИКАЦИИ.