Создание и удаление индексов.
Понятие индекса. Необходимость использования.
Индексы – это объекты баз данных, основная цель которых состоит в повышении производительности запросов.
Индекс SQL похож на полный алфавитный указатель в книге, т.е. на список всех терминов, упоминающихся в книге со ссылками на все места, где они встречаются.
Индекс SQL – это список всех значений в группе из одного или нескольких столбцов, упорядоченный в некотором приемлемом для данного типа данных смысле (например, в порядке возрастания для чисел или в алфавитном порядке для символьных строк). Каждое значение имеет указатель на строку в таблице, где это значение встречается.
Индексы работают неявно. Они в основном используются в запросах. При выполнении запроса СУБД решает, какие индексы надо применить и надо ли вообще.
Индексы не зависят от таблицы, для которой были созданы.
Необходимость использования индексов.
- Столбец часто используется в предложении WHERE или условии соединения;
|
|
- Столбец имеет широкий диапазон значений;
- Столбец содержит большое количество неопределенных значений;
- Два или столбцов часто используются вместе в предложении WHERE или условии соединения;
- Таблица большого размера, и предполагается, что большинство запросов будут выбирать менее 10-15% строк.
Когда не следует создавать индекс:
- Таблица небольшого размера.
- Столбцы не очень часто используются как параметры в условиях при запросе.
- Большая часть запросов будет выбирать более чем 10-15% строк.
- Таблица часто обновляется.
Создание и удаление индексов.
Индексы можно создать автоматически (при описании ограничений типа PRIMARY KEY или UNIQYE) или вручную как объект:
CREATE INDEX имя_индекса ON имя_таблицы (имя_столбца)
Пример 1:
CREATE INDEX Orderdate ON Orders(odate)
Определение индекса содержится в представлении словаря данных USER_INDEXES. Таблица USER_IND_COLUMNS содержат имя индекса, имя таблицы и имя столбца.
SELECT ic.index_name, ic.column_name, ic.column_position col_pos, ix.uniqueness
From user_indexes ix, user_ind_columns ic
WHERE ic.index_name=ix.index_name
AND ic.table_name=’имя_таблицы’
Поиск по индексу производится гораздо быстрее, чем поиск по таблице, так как индекс упорядочен и занимает меньше места.
Пример 2:
SELECT *