Лекция 6: Особенности выполнения запросов · 2019-09-05 ·...

Post on 15-Aug-2020

3 Views

Category:

Documents

0 Downloads

Preview:

Click to see full reader

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 — Регенты университета Калифорнии.

Настоящим разрешается использование, копирование, модификация и распространение данного программного продукта и документации для любых целей, бесплатно и без письменного разрешения, при условии сохранения во всех копиях приведённого выше уведомления об авторских правах и данного параграфа вместе с двумя последующими параграфами.

УНИВЕРСИТЕТ КАЛИФОРНИИ НИ В КОЕЙ МЕРЕ НЕ НЕСЁТ ОТВЕТСТВЕННОСТИ ЗА ПРЯМОЙ, КОСВЕННЫЙ, НАМЕРЕННЫЙ, СЛУЧАЙНЫЙ ИЛИ СПРОВОЦИРОВАННЫЙ УЩЕРБ, В ТОМ ЧИСЛЕ ПОТЕРЯННЫЕ ПРИБЫЛИ, СВЯЗАННЫЙ С ИСПОЛЬЗОВАНИЕМ ЭТОГО ПРОГРАММНОГО ПРОДУКТА И ЕГО ДОКУМЕНТАЦИИ, ДАЖЕ ЕСЛИ УНИВЕРСИТЕТ КАЛИФОРНИИ БЫЛ УВЕДОМЛЁН О ВОЗМОЖНОСТИ ТАКОГО УЩЕРБА.

УНИВЕРСИТЕТ КАЛИФОРНИИ ЯВНЫМ ОБРАЗОМ ОТКАЗЫВАЕТСЯ ОТ ЛЮБЫХ ГАРАНТИЙ, В ЧАСТНОСТИ ПОДРАЗУМЕВАЕМЫХ ГАРАНТИЙ КОММЕРЧЕСКОЙ ВЫГОДЫ ИЛИ ПРИГОДНОСТИ ДЛЯ КАКОЙ-ЛИБО ЦЕЛИ. НАСТОЯЩИЙ ПРОГРАММНЫЙ ПРОДУКТ ПРЕДОСТАВЛЯЕТСЯ В ВИДЕ "КАК ЕСТЬ", И УНИВЕРСИТЕТ КАЛИФОРНИИ НЕ ДАЁТ НИКАКИХ ОБЯЗАТЕЛЬСТВ ПО ЕГО ОБСЛУЖИВАНИЮ, ПОДДЕРЖКЕ, ОБНОВЛЕНИЮ, УЛУЧШЕНИЮ ЛИ МОДИФИКАЦИИ.

top related