11.1. Введение#

11.1. Введение

11.1. Введение

Предположим, у нас есть таблица, похожая на эту:

CREATE TABLE test1 (
    id integer,
    content varchar
);

и приложение выполняет множество запросов следующего вида:

SELECT content FROM test1 WHERE id = constant;

Без предварительной подготовки система должна была бы просканировать всю таблицу test1 строка за строкой, чтобы найти все соответствующие записи. Если в таблице test1 много строк, а только несколько строк (возможно, ноль или одна) должны быть возвращены таким запросом, это явно неэффективный метод. Но если система была настроена на поддержку индекса на столбце id, она может использовать более эффективный метод для поиска соответствующих строк. Например, ей может потребоваться пройти только несколько уровней в глубину поискового дерева.

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

Следующая команда может быть использована для создания индекса на столбце id, как обсуждалось:

CREATE INDEX test1_id_index ON test1 (id);

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

Чтобы удалить индекс, используйте команду DROP INDEX. Индексы могут быть добавлены и удалены из таблиц в любое время.

После создания индекса дальнейшее вмешательство не требуется: система будет обновлять индекс при изменении таблицы и использовать его в запросах, когда это будет более эффективно, чем последовательное сканирование таблицы. Однако, вам может потребоваться регулярно запускать команду ANALYZE, чтобы обновлять статистику и позволить планировщику запросов принимать обоснованные решения. См. раздел Глава 14 для получения информации о том, как узнать, используется ли индекс и когда и почему планировщик может выбрать не использовать индекс.

Индексы также могут быть полезными для команд UPDATE и DELETE с условиями поиска. Индексы также могут использоваться в поиске с использованием объединений. Таким образом, индекс, определенный на столбце, который является частью условия объединения, также может значительно ускорить запросы с объединениями.

Создание индекса на большой таблице может занять много времени. По умолчанию, Tantor BE позволяет выполнять чтение (команды SELECT) на таблице параллельно с созданием индекса, но запись (команды INSERT, UPDATE, DELETE) блокируется до завершения построения индекса. В производственных средах это часто неприемлемо. Возможно разрешить выполнение записи параллельно с созданием индекса, но есть несколько оговорок, о которых следует знать — для получения дополнительной информации см. Building Indexes Concurrently.

После создания индекса система должна поддерживать его синхронизацию с таблицей. Это добавляет издержки на операции манипулирования данными. Индексы также могут предотвратить создание только в куче (heap-only tuples) кортежей. Поэтому индексы, которые редко или никогда не используются в запросах, следует удалить.