Изменения

Перейти к: навигация, поиск

Этапы обработки запроса. Перезапись запросов

2618 байт добавлено, 23:59, 26 декабря 2021
Обработка запроса
От выбора плана '''сильно''' зависит производительность
==== Пример базы данных: ====
Пусть у нас есть база данных Университет.Есть следующая таблица Students:
*<var>Students(SId, FirstName, LastName, GId, Year)</var>
** $10^4$ записей
** Индексы: <var>(SId)</var> (кластеризованный), <var>(GId)</var>
И следующая таблица Groups:
*<var>Groups(GId, Name)</var>
** $10^3$ записей
** Индексы: <var>(GId)</var> (кластеризованный), <var>(Name)</var>
 
==== Запрос: ====
 
Будем выбирать студентов группы M3439
Фамилии студентов группы M3439
==== Планы запросов без индексов ====
Делаем декартово произведение, на него навешено условие естественного соединения, потом делаем фильтр и потом проецируем.
* План 1
** $π_{FirstName}(σ_{Name=M34391}(σ_{S.GId=G.GId}(S × G)))$
** Получаем $10^4·10^3 + 10^4·10^3 + 10^4 + 20 ≈ 2·10^7$ операций
Сразу делаем естественное соединение без отдельной стадии фильтрации и декартового произведения. Тем не менее в середине все равно строим $10^4·10^3$, но только один раз. Потом опять отфильтруем и спроецируем. Снизили трудозатраты примерно в два раза.
*План 2
** $π_{Name}(σ_{Name=M34391}(S ⋈ G))$
** $10^4·10^3 + 10^4 + 20 ≈ 10^7$ операция
Сначала отфильтруем группы. Это обработать 1000 групп. Выберем из них 1 группу. Потом переберем $10^4$ студентов. И финальная проекция на 20 элементов.
Снизили время на 3 порядка!
* План 3
** $π_{Name}(S ⋈ σ_{Name=M34391}(G))$
==== Планы запросов с индексами ====
Аналогично плану 3, только теперь не перебираем всех студентов, а достаем их из индекса. Если был индекс на основе B дерева глубины 3. Мы дошли до его листа и достали примерно 20 студентов из группы. Осталось сделать проекцию, а это еще 20 операций. В итоге снизили время еще на порядок.
* План 4. <var>Students(GId)</var>
** $π_{Name}(S ⋈ σ_{Name=M34391}(G))$
** $10^3 + (3 + 20) + 20 ≈ 10^3$ операций
Поиск группы тоже можем ускорить, так как есть индекс по имени группы. Он скорее всего поместится в памяти, оценим его глупину как 2. К этому нам нужно достать инфомрацию об одной из групп. Итого нашли конкретнуб группу, потом сделаем соединение с помощью индекса по GroupId в студентах и финальная проекция.
* План 5. <var>Groups(Name)</var>, <var>Students(GId)</var>
** $π_{Name}(S ⋈ σ_{Name=M34391}(G))$
==== Результат ====
Начали с $2·10^7$ операций — наиболее '''медленный''' план
Закончили $45$ операций — наиболее '''быстрый''' план
Разница на много порядков. Сократили время чуть ли не в миллион раз. Выбор плана исполнения запроса очень-очень сильно влияет на скорость работы.
----
[[Файл:Structure_Query.png|430px|thumb|right|Обработка запроса]]
Анонимный участник

Навигация