...
Блок кода |
---|
|
-- индексы
-- структура индекса, rowid
truncate table h;
insert into h select rownum, object_name, object_id, object_id from all_objects where rownum < 10;
commit;
select rowid, p from h;
select * from h where rowid = 'AAAN95AAEAAAAfHAAA';
declare
r_t number;
o_n number;
f_n number;
b_n number;
r_n number;
r rowid;
begin
select rowid into r from h where rownum < 2;
dbms_rowid.rowid_info(r, r_t, o_n, f_n, b_n, r_n);
dbms_output.put_line('rowid type = ' || r_t);
dbms_output.put_line('object number = ' || o_n);
dbms_output.put_line('file number = ' || f_n);
dbms_output.put_line('block number = ' || b_n);
dbms_output.put_line('row number = ' || r_n);
end;
select * from user_objects where object_name = 'H';
select * from user_tables where table_name = 'H';
select * from dba_data_files;
-- создание индексов
truncate table h;
insert into h select rownum, object_name, object_id, object_id from all_objects;
commit;
create index ind_s on h(s);
select * from user_indexes where table_name = 'H';
drop index ind_s;
select * from user_indexes where table_name = 'H';
create index ind_s_1 on h(s desc);
create unique index ind_n on h(n);
select index_name, index_type, table_name, status, funcidx_status from user_indexes where table_name = 'H';
-- информация по таблицам и индексам
select * from user_tables;
select * from user_tab_columns;
select * from user_constraints;
select * from user_cons_columns;
select * from user_indexes;
select * from user_ind_columns;
|
Доступ к таблицам по индексам
Блок кода |
---|
|
analyze table h compute statistics for table for all indexes for all indexed columns;
set autotrace on
set timing on
-- операции по индексу
drop index ind_s on h(s);
select * from h where s = 'aaaa';
create index ind_s on h(s);
select * from h where s = 'aaaa';
select * from h where s||'a' = 'aaaa';
select * from h where upper(s) = 'aaaa';
select * from h where s like 'aaaa%';
select * from h where s like '%aaaa';
drop index ind_nu;
select * from h where nu = 1222;
create index ind_nu on h(nu);
select * from h where nu = 1222;
select * from h where nu+1 = 1222;
select * from h where nu = 1222+1;
select * from h where abs(nu) = 1222;
select * from h where s = '123';
select * from h where s = 123;
-- выбор между доступом по индексам и full scan
delete from h;
insert into h(p, s, n, nu) select object_id, object_name, object_id, object_id from all_objects where rownum < 5;
analyze table h compute statistics for table for all indexes for all indexed columns;
select * from h where s = 'DUAL';
delete from h;
insert into h(p, s, n, nu) select object_id, object_name, object_id, object_id from all_objects;
-- со старой статистикой !!!
select * from h where s = 'DUAL';
analyze table h compute statistics for table for all indexes for all indexed columns;
-- с новой статистикой !!!
select * from h where s = 'DUAL';
-- обработка null значений
-- поля null не проверяются на уникальность
insert into h(p, s, n, nu) values(-1, 'asd', null, null);
insert into h(p, s, n, nu) values(-2, 'asd', null, null);
insert into h(p, s, n, nu) values(-3, 'asd', null, -1);
select * from h where s is null;
|
Функциональные индексы.
Индексы по функции. Эти индексы на основе В*-дерева или битовых карт хранят вычисленный результат применения функции к столбцу или столбцам строки, а не сами данные строки. Это можно использовать для ускорения выполнения запросов вида:
SELECT * FROM T WHERE ФУНКЦИЯ(СТОЛБЕЦ) = НЕКОТОРОЕ_ЗНАЧЕНИЕ,
поскольку значение ФУНКЦИЯ(СТОЛБЕЦ) уже вычислено и хранится в индексе.
Блок кода |
---|
|
-- функциональные индексы
select * from h where n*n = 100;
-- надо иметь такие права для создания функциональных индексов
alter system set query_rewrite_enabled=true;
grant query rewrite to stud;
create index ind_f_n on h(n*n);
select * from h where n*n = 100;
create index ind_n on h(n);
select index_name, index_type, table_name, status, funcidx_status from user_indexes where table_name = 'H';
select * from h where n = 100;
select * from h where n > 0;
|
Битовые индексы.
Обычно в В*-дереве имеется однозначное соответствие между записью индекса и строкой - запись индекса указывает на строку. В индексе на основе битовых карт запись использует битовую карту для ссылки на большое количество строк одновременно. Такие индексы подходят для данных с небольшим количеством различных значений, которые обычно только читаются. Столбец, имеющий всего три значения — Y, N и NULL, — в таблице с миллионом строк очень хорошо подходит для создания индекса на основе битовых карт. Предположим, создается индекс на основе битовых карт по столбцу JOB в таблице ЕМР:
Блок кода |
---|
|
create BITMAP index job_idx on emp(job); |
Сервер Oracle будет хранить в индексе примерно следующее:
Image Added