примере создается составной индекс, которому присваивается
имя i_employees_first_last_name, по столбцам flrst_name и last_name таблицы
employees:
□ CREATE INDEX i_employees_first_last_name ON
employees(first_name, last_name);
Создание индексов на базе функций
В предыдущем разделе рассматривался индекс i_customers_last_name. Сделаем
следующий запрос:
□ SELECT first_name, last_name
FROM customers
WHERE last_name = UPPER(‘ BROWN’ );
Поскольку в запросе используется функция (в нашем случае это функция
UPPER), индекс i_customers_last_name не используется. Если понадобится
индекс, который будет основываться на результатах выполнения
функции, нужно создать так называемый индекс на базе функции, или
функциональный индекс:
П CREATE INDEX i_customers_last_name_func
ON customers(UPPER(last_name));
336 Глава 10
Кроме того, ваш АБД должен установить в true параметр инициализации
QUERY_REWRITE_ENABLED (значение по умолчанию этого параметра равно
false), чтобы можно было воспользоваться преимуществами функциональных
индексов:
□ CONNECT system/manager
ALTER SYSTEM SET QUERY_REWRITE_ENABLED=TRUE;
Получение информации об индексах
Можно получить информацию о своих индексах, задав запрос к представлению
user_indexes. В таблице 10.7 перечислены некоторые столбцы user_
indexes.
Примечание Информацию о всех индексах можно получить, выполнив запрос к представлению
all_indexes.
В следующем примере выбираются столбцы index_name, table_name,
uniqueness и status из таблицы user_indexes для таблиц customers и
employees. В списке индексов оказывается индекс custome rs_pk, который
является уникальным индексом, автоматически создаваемым базой данных
Oracle для столбца первичного ключа customer_id таблицы customers:
□ CONNECT store/store_password
SELECT index_name, table_name, uniqueness, status
FROM user_indexes
WHERE table_name IN (‘CUSTOMERS', ‘EMPLOYEES’)
ORDER BY index_name;
INDEX_NAME TABLE_NAME UNIQUENES STATUS
CUST0MERS_PK CUSTOMERS UNIQUE VALID
EMPL0YEES_PK EMPLOYEES UNIQUE VALID
I CUSTOMERS_LAST_NAME CUSTOMERS NONUNIQUE VALID
I CUSTOMERS PHONE CUSTOMERS UNIQUE VALID
I EMPLOYEES FIRST LAST NAME EMPLOYEES NONUNIQUE VALID
I FUNC CUSTOMERS LAST NAME CUSTOMERS NONUNIQUE VALID
Получение информации об индексах для столбца
Информацию об индексах для столбца можно получить, задав запрос к
представлению user_ind_columns. В таблице 10.8 перечислены некоторые
столбцы user_ind_columns.
Таблица 10.7. Некоторые столбцы в userjndexes
Столбец Тип___________Описание____________________________________________
index_name VARCHAR2(30) Имя индекса.
table_owner VARCHAR2(30) Пользователь, владеющий таблицей.
table_name VARCHAR2(30) Имя таблицы, для которой построен индекс.
Создание таблиц, последовательностей, индексов и представлений 337
Таблица 10.7. Некоторые столбцы в userjndexes (окончание)
Столбец Тип Описание
VARCHAR2(9) Указывает, уникален ли индекс. Устанавливается на UNIQUE
ИЛИ N0NUNIQUE.
VARCHAR2(8 ) Указывает, является ли индекс действующим. Устанавлива-
__________________________ ется на v a l i d или in v a l id .________________________________
Таблица 10.8. Некоторые столбцы в представлении user_ind_columns
uniqueness
s ta tu s
Столбец Тип Описание
index_name VARCHAR2(30) Имя индекса,
tablejname VARCHAR2(30) Имя таблицы.
coluinn_name VARCHAR2(30) Имя столбца, по которому построен индекс.
Примечание Информацию о всех индексах, к которым вам разрешен доступ, можно получить,
задав запрос к представлению all_ind_columns.
В следующем примере из user_ind_columns выбираются столбцы index_
name, table_name и column_name для таблиц customers и employees:
COLUMN table_name FORMAT a15
COLUMN column_name FORMAT a15
SELECT index_name, table_name, column_name
FROM user_ind_columns
WHERE table_name IN (‘CUSTOMERS’, 'EMPLOYEES’)
ORDER BY index_name;
INDEX NAME TABLE NAME
CUST0MER_PK CUSTOMERS
EMPL0YEES_PK EMPLOYEES
I_CUSTOMER_LAST_NAME CUSTOMERS
I_CUST0MER_PH0NE CUSTOMERS
I_EMPLOYEES_FIRST_LAST_NAME EMPLOYEES
I_EMPLOYEES_FIRST_LAST_NAME EMPLOYEES
I_FUNC_CUSTOMERS_LAST NAME CUSTOMERS
C0LUMN_NAME
CUST0MER_ID
EMPL0YEE_ID
LAST_NAME
PHONE
LAST_NAME
FIRST_NAME
SYS_NC00006$
Модификация индекса
Для модификации индекса используется оператор ALTER INDEX. Следующий
пример переименовывает индекс i_customers_phone в i_customers_phone_
number:
□ ALTER INDEX i_customers_phone RENAME TO i_customers_phone_number;
Удаление индекса
Удалить индекс можно, используя оператор DROP INDEX. В следующем примере
удаляется индекс i_customers_phone_number:
□ DROP INDEX i_customers_phone_number;
338 Глава 10
Создание bitmap-индекса
Bitmap-индексы обычно используют в хранилищах данных, которые представляют
собой базы данных, содержащие очень большие объёмы информации.
Данные из хранилища обычно читают с помощью большого количества
запросов, но при этом не изменяют с помощью большого количества
одновременных транзакций. Хранилища данных обычно используют в
организациях для анализа поведения бизнеса, например, отслеживания