Базы данных/Лабораторная работа 3

Материал из Wiki - Факультет компьютерных наук
Перейти к: навигация, поиск

Методичка в разработке, но можно начинать делать


Цели лабораторной работы:

  • научиться анализировать план выполнения запросов и уменьшать сложность выполнения запросов,
  • научиться анализировать состояние сервера СУБД, обучиться основам администрирования.

Введение

Ваша задача в этой лабораторной работе:

  • С помощью EXPLAIN посчитать сложность выполнения комплексных запросов из прошлой лабораторной работы,
  • Разобраться с выводом EXPLAIN и суметь объяснять, какие части подзапроса сколько будут выполняться, сколько данных будет задействовано.
  • С помощью индексов ускорить выполнение запросов.
  • Проанализировать выполнение запроса после создания индексов и сравнить планы выполнений.


Создание индексов

Индексы нужны для того, чтобы ускорить доступ к данным. Для каждой таблицы доступен только один самый быстрый индекс - первичный ключ. Как правило, это id в каждой таблице. Запросы, в условиях которых фильтрация происходит только по id, работают быстро, таблица при этом не сканируется целиком.

В таблицу также можно добавить еще индексы для ускорения выполнения запросов. Они могут относиться как к одному, так и к группе атрибутов. Индексы выбирают исходя из информационной потребности пользователей: если в запросах часто встречается какая-либо комбинация условий, то индекс строят именно на эти условия.

Добавление индексов требует дополнительного места на диске, но важнее то, что любые манипуляции с данными становятся более затратными, так как индекс в этом случае должен обновиться. Из-за этого неразумно выстраивать все возможные индексы, следует ограничиться только наиболее востребованными.

Чтобы создать индекс, нужно использовать команду CREATE INDEX, указать имя индекса и список атрибутов, по которым он будет строиться, опционально можно указать тип индекса.

Важно: прежде чем создавать индексы, посмотрите, сколько места занимают ваши данные. Это можно сделать средствами

Типы индексов

Наиболее популярный тип индекса - B-дерево. Эта структура хорошо подходит для атрибутов, которые можно сравнивать между собой, выполняя операции: <, <=, =, >=, >. Также индексы этого типа поддерживают быструю проверку IS (NOT) NULL, поэтому они хорошо подходят для атрибутов с большим количеством пропусков. В-деревья ускоряют любые операции, связанные со сравнением значений, в том числе сортировку и группировку.

Синтаксис создания индекса:

 CREATE INDEX index_name ON table_name (column_name);

Второй по популярности тип индекса - hash, который позволяет быстро проводить сравнения на равенство. Этот тип также подходит для условий типа WHERE column_name IN ( ... ).

Синтаксис создания индекса:

 CREATE INDEX index_name ON table_name USING HASH (column_name);


Функции в индексах

Удобно для строк создавать также индексы независимые от регистра:

 CREATE INDEX index_name ON table_name (lower(column_name)); 

В этом случае, выбирая WHERE lower(title) = 'the matrix' приведение значений колонки не нужно, и запрос выполнится быстро.

Индексы на несколько колонок

Удобный для часто встречающихся комбинаций условий.

Синтаксис:

 CREATE INDEX index_name ON table_name (column1_name, column2_name);


Уникальный индекс

Этот индекс также добавляет проверку целостности при изменении данных.

Синтаксис:

 CREATE UNIQUE INDEX index_name on table_name (column_name);

Условные индексы

Можно создать еще более специализированный индекс на конкретные условия.

 CREATE INDEX index_name on title (kind_id, production_year) where (production_year>2000 and kind_id=1);

Этот индекс позволит выбирать фильмы выпущенные после 2000 года, при этом для записей не удовлетворяющих условию все останется по-прежнему (как скорость выборки, так и скорость изменения данных).

План запроса. EXPLAIN

(В процессе написания)

Дополнительно:


Параметры и состояние PostgreSQL-сервера

(В процессе написания)

В этом разделе собраны инструменты и техники для мониторинга и оценки статуса сервера СУБД и сбора статистики.

Дополнительно: