索引的意义在于类似一本书的目录,可以快速的查找到需要的内容。
create or replace unique|bitmap index . on .
(| asc|desc ,
| asc|desc ...)
tablespace
storage
logging|nologging
compute statistics
nocompress|compress
nosort|reverse
partition|global partition
B树索引是一组有序的条目。每个条目都包含一个搜索键值以及一个指向包含该值的表中一行的指针。服务器可以可预测和有效地攻击B树的有序结构,并且B树索引小于基础表。当一列包含大多数不同的值(索引基数很低)时,B树索引最能提高性能。它们还用于强制唯一性。
考虑到高选择性,请评估在以下列上创建B树索引:
在这些情况下,索引会浪费空间并减慢加载过程。
一般是主键字段,约束条件字段(where条件),基数大的字段(可分性高),order by 字段,也尽量建立索引。这样就不用进行order by 了,减少了排序的消耗。
create unique index idx_test_uid on test_uid(name) online tablespace tablespace2;
注意:online关键字,原因参考
https://blog.csdn.net/jc_benben/article/details/86569074?utm_medium=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-1.nonecase&depth_1-utm_source=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-1.nonecase
条件定义模式固定,例如where条件中经常一起出现的字段。如果组合比较灵活,则分别建单一索引。
复合索引要注意前缀性风险。例如复合索引ind_1(a,b,c),如果没有a字段出现,则索引失效。
复合索引优先于单字段索引。复合索引中也要注意顺序,要按可选性高低或者条件定义的频度进行排序。例如,纳税人识别号,税务机关代码,月份。
create index idx_name on tablename(column_name1,column_name2) tablespace tablespace_name;
注意: 其前导列一定要是使用最频繁的列。
当载入一些有序数据时,索引肯定会碰到与 I/O 相关的一些瓶颈。在数据载 入期间,某部分索引和磁盘肯定会比其他部分使用频繁得多。为了解决这个问题, 可以把索引表空间存放在能够把文件物理分割在多个磁盘上的磁盘体系结构上。
为了解决这个问题,Oracle 还提供了一种反转键索引的方法。如果数据以反转键索引存储,这些数据的值就会与原先存储的数值相反。这样,数据 1234、1235 和 1236 就被存储成 4321、5321 和 6321。结果就是索引会为每次新插入 的行更新不同的索引块。
create index PK_REV_TEST on TEST(EMPNO) REVERSE;
注意:REVERSE 为反转键索引关键字,查看是否为反转键索引可使用以下语句
select TABLE_NAME,INDEX_NAME,INDEX_TYPE from user_indexes where INDEX_NAME like '%TEST%';
INDEX_TYPE 为 NORMAL/REV 即创建成功
某表的一列在平常SQL中该列都是放在函数里面,为了能用到索引来提高检索速度。
例如:create index idx_fun on emp (upper(name));
建立需考虑的问题:
基于函数的索引非常有用,但在实现时必须小心。在表上创建的索引越多,INSERT、UPDATE 和 DELETE 语句的执行就会花费越多的时间。 注意:对于优化器所使用的基于函数的索引来说,必须把初始参数 QUERY_REWRITE _ ENABLED 设定为 TRUE。
对于具有大量重复值的列。例如,“大小”列仅包含五个不同的值(“小”,“小”,“中”,“大”,“盛大”)。
当事实表中的外键约束列上存在位图索引时,Oracle的“星形转换算法”使用位图索引将事实表连接到其维度。
位图索引中的条目由搜索键值和描述包含搜索键值的行的位图组成。映射中的每一位都对应于表中的一行,而on上的一位指示包含搜索键中值的行。核心价值。
create bitmap index sex_bitmap_index on student(sex);
以下内容来源于 https://blog.csdn.net/lklinkang/article/details/6130859
1,<>
2,单独的>,<,(有时会用到,有时不会)
3,like "%_" 百分号在前.
4,表没分析.
5,单独引用复合索引里非第一位置的索引列.
6,字符型字段为数字时在where条件里不添加引号.
7,对索引列进行运算.需要建立函数索引.
8,not in ,not exist.
9,当变量采用的是times变量,而表的字段采用的是date变量时.或相反情况。
10, 索引失效。
11,基于cost成本分析(oracle因为走全表成本会更小):查询小表,或者返回值大概在10%以上
12,有时都考虑到了 但就是不走索引,drop了从建试试在
13,B-tree索引 is null不会走,is not null会走,位图索引 is null,is not null 都会走
14,联合索引 is not null 只要在建立的索引列(不分先后)都会走,
in null时 必须要和建立索引第一列一起使用,当建立索引第一位置条件是is null 时,其他建立索引的列可以是is null(但必须在所有列都满足is null的时候),或者=一个值;
当建立索引的第一位置是=一个值时,其他索引列可以是任何情况(包括is null =一个值),以上两种情况索引都会走。其他情况不会走。
Oracle的优化器共有3种:
a. RULE (基于规则) b. COST (基于成本) c. CHOOSE (选择性)。
设置缺省的优化器,可以通过对init.ora文件中OPTIMIZER_MODE参数的各种声明,如RULE,COST,CHOOSE,ALL_ROWS,FIRST_ROWS 。你当然也在SQL句级或是会话(session)级对其进行覆盖。
为了使用基于成本的优化器(CBO, Cost-Based Optimizer) , 你必须经常运行analyze 命令,以增加数据库中的对象统计信息(object statistics)的准确性。
如果数据库的优化器模式设置为选择性(CHOOSE),那么实际的优化器模式将和是否运行过analyze命令有关。如果table已经被analyze过, 优化器模式将自动成为CBO , 反之,数据库将采用RULE形式的优化器。
(分析table
analyze table PROD_PARTS compute statistics;
ANALYZE TABLE PROD_PARTS COMPUTE STATISTICS FOR ALL INDEXED COLUMNS;
analyze table PROD_PARTS compute statistics for table for all indexes for all indexed columns;
)【有一次索引失效之后,请教DBA后,发现是数据统计的问题,具体的解决办法是执行以上语句】
在缺省情况下,Oracle采用CHOOSE优化器, 为了避免那些不必要的全表扫描(full table scan), 你必须尽量避免使用CHOOSE优化器,而直接采用基于规则或者基于成本的优化器。
给该语句加上hint后,强制其使用'RECORD_ENTITYID' 这个索引
sql语句变成这样
引用
select /*+ index(record,record_entityid) */ *
from RECORD
where entityId='24' and entityType='blog';