109.Oracle数据库SQL开发之 索引
欢迎转载,转载请标明出处:http://blog.csdn.net/notbaron/article/details/50043069
通常在需要从包含很多行的表中检索少数几行时,都应该对列创建索引。有一条基本的准则是:当任何当个查询要检索的行少于或等于整个表行数的10%时,索引就非常有用。
1. 创建B-树索引
创建索引使用CREATE INDEX语句可以用来创建B-数索引
语法如下:
CREATE [UNIQUE] INDEX index_name ONtable_name( column_name,[,column_name …])
TABLESPACE tab_space;
由于性能方面的原因,通常应该将索引与表存储到不同的表空间中。
执行如下查询:
store@PDB1> selectcustomer_id,first_name,last_name from customers where last_name='Brown';
CUSTOMER_ID FIRST_NAME LAST_NAME
----------- ---------- ----------
1 John Brown
如果last_name列的值都是唯一的,以使任何在WHERE子句中使用last_name列的查询所返回的行数都小于该表总行数的10%. 就意味着last_name列非常适合创建索引。
store@PDB1> create index i_customers_last_name oncustomers(last_name);
Index created.
此外,可以使用唯一索引可以实现列值的唯一值。例如:
store@PDB1> create unique index i_customers_phoneon customers(phone);
Index created.
也可以对多列创建复合索引。
store@PDB1> create indexi_employees_first_last_name on employees(first_name,last_name);
Index created.
2. 创建基于函数的索引
执行如下:
store@PDB1> select first_name,last_name fromcustomers where last_name=UPPER('BROWN');
no rows selected
这个查询使用了一个函数UPPER(),因此不会使用索引i_employees_last_name.
如果想让索引可以基于函数的结果使用,就必须创建基于函数的索引。
例如下:
store@PDB1> create indexi_func_customers_last_name on customers(UPPER(last_name));
Index created.
为了利用基于函数的索引,DBA必须将初始化参数QUERY_REWRITE_ENABLED设置为TRUE。例如:
ALTER SYSTEM SET QUERY_REWRITE_ENABLED=TRUE;
3. 从数据字典中获取有关索引的信息
从user_indexes视图中可以获得有关索引的信息。
查询all_indexes视图可以获得有关所有要访问的索引信息。
store@PDB1> selectindex_name,table_name,uniqueness,status from user_indexes where table_name in('CUSTOMERS','EMPLOYEES') order by index_name;
INDEX_NAME
----------------------------------------------------------------------------------------------------
TABLE_NAME
----------------------------------------------------------------------------------------------------
UNIQUENES STATUS
--------- --------
CUSTOMERS_PK
CUSTOMERS
UNIQUE VALID
EMPLOYEES_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
6 rows selected.
4. 获取列索引的信息
通过查询user_ind_columns视图可以获得列索引的信息。
store@PDB1> selectindex_name,table_name,column_name from user_ind_columns where table_name in('CUSTOMERS','EMPLOYEES') order by index_name;
INDEX_NAME
----------------------------------------------------------------------------------------------------
TABLE_NAME COLUMN_NAME
--------------- ---------------
CUSTOMERS_PK
CUSTOMERS CUSTOMER_ID
EMPLOYEES_PK
EMPLOYEES EMPLOYEE_ID
I_CUSTOMERS_LAST_NAME
CUSTOMERS LAST_NAME
I_CUSTOMERS_PHONE
CUSTOMERS PHONE
I_EMPLOYEES_FIRST_LAST_NAME
EMPLOYEES LAST_NAME
I_EMPLOYEES_FIRST_LAST_NAME
EMPLOYEES FIRST_NAME
I_FUNC_CUSTOMERS_LAST_NAME
CUSTOMERS SYS_NC00006$
7 rows selected.
5. 修改索引
ALTER INDEX语句可以用来修改索引。
store@PDB1> alter index i_customers_phone renameto i_customers_phone_number;
Index altered.
6. 删除索引
DROP INDEX可以用来删除索引,如下:
store@PDB1> drop index i_customers_phone_number;
Index dropped.
7. 创建位图索引
位图索引一般用于数据仓库中,数据仓库是包含大量数据的数据库。数据仓库中的数据一般使用很多查询来读取,但数据并不被很多并发事务所修改。数据仓库一般被组织机构用来进行商业智能分析,例如监控销售趋势。
位图索引的候选列是在很多查询中被引用但只包含小范围值的列。
位图索引一般用来包含大量数据且内容不常修改的表中。而且位图索引只应该在包含少量不同值的列上创建。如果某列的不同值数量少于表中行数的1%,或者如果某列的值的重复次数多于100次,那么此列就是位图索引的候选列。
创建位图索引如下:
store@PDB1> create bitmap index i_order_status onorder_status(status);
Index created.