oracle 强制走索引
(4)合理安排索引列。在createindex语句中,列的排序会影响查询的性能,通常将最常用的列放在前面。创建一个索引来提高多列的查询效率时,应该清楚地了解这个多列的索引对什么列的存取有效,对什么列的存取无效。若查询数据量过大,需要走索引提升查询速度,但查询不走索引,可通过强制走索引方式让查询走索引查询
oracle查看索引_Oracle查看索引列
oracle查看索引_Oracle查看索引列
用法:/ 在object_name列上建立索引+index(t idx_name)/
比如:select /+index(t idx_name)/t.a from t; t是表别名,idx_name是索引名。若要走多个索引可在后面添加比如:
/+index(t idx_name1)(t idx_name2)/ 不过自己尝试似乎没有走多个有待验证。
oracle 如何查找视图名称
用Oracle Enterprise Mar Console登录进去,选择你要查找视图的数据库,选择方案----选择和你连接Oracle用户相同的方案,个为表,第二个为索引,第三个就是视图,在这里可以查看,也可以修改。select from dba_views;
user_views,all_views也可以
另外DBA_OBJECTS、ALL_OBJECTS和USER_OBJECTS显示了模式对象的信息,包括视图。
SELECT VISELECT dbms_rowid rowid_block_number( AAAGFqAABAAAIWEAAA ) from dual;EW_NAME FROM USER_VIEWS;
技术感悟:我对Oracle索引的理解
一般情况下一张表的主键就可以了,看你的查询条件,我建议你把 type 设为索引。本文只讲最最平常最最简单的索引 就是以create index ix on tx(a b c);形式创建的索引 而不讲位图索引 反向键索引 倒序索引 基于函数的索引等等 其实呢 只要是基于B树的索引 不管是在Oracle Mysql 还是其它数据库中 原理应当都是一样的
索引最重要的一个性质应该就是有序 索引中的每一项 是从左到右 从小到大 以严格的顺序排列好的
下面的讨论都以上面的索引ix(a b c)为例
把这棵索引的叶子画到纸上 大概是这样的
a a a an
b b b bn
c c c cn
上面这个 ×n的矩阵 每一列代表了一条记录 同时这一列记录 也对应了表里的一条记录 当然 在Oracle里 对于non unique索引 需要补上rowid 才是真正的 上面的索引相当于create unique index ix on tx(a b c rowid); 我们把这个细节忽略掉
把每一列看作一个向量 vi = (ai bi ci)
有序的含义就是
vi < vj iff i < j;
vi < vj这么定义
(ai < aj) or (ai = aj and bi < bj) or (ai = aj and bi = bj and ci < cj)
从这个基本性质 我们可以得到一些其它性质(为了打字方便 ai+k表示a(i+k) 而不是a(i)+k)
) 如果ai ai+ …… ai+k 都是相等这些字段可以出现在select列表中 where条件中 order by字段中 也可以出现在两个表连接时的连接条件中的 那么
bi <= bi+ <= …… <= bi+k
) 如果ai ai+ …… ai+k是相等的 而且bi bi+ …… bi+k也是相等的 那么
ci <= ci+ <= …… < ci+k
但是从 ai ai+ …… ai+k相等 我们得不到
ci <= ci+ <= …… <= ci+k这个结论
索引相关的很多问题 都和上面提到的这几个性质有关系
下面来看几个常见的查询:
q ) select from tx where a = :va and b = :vb;
q ) select from tx where a = :va and c = :vc;
q ) select from tx where a = :va order by b;
q ) select from tx where a = :va order by b c;
q ) select from tx where a = :va order by c;
q ) select from tx where a = :va order by b c desc;
q ) select from tx where a = :va order by b desc c desc;
q ) select from tx where a = :va and b <= :vb
qa) select from tx where a = :va and b >= :vb
qb) select from tx where a = :va and c >= :vc
qc) select from tx where a = :va and b >= :vb order by c
大家可以考虑一下这些查询各自会以怎样的方式执行 不同查询之间有什么区别?
同样 为什么在索引字段上作了函数运算之后 索引不可用?
考虑下面这个语句:
select from tx where f(a) = :vfa;
首先 在字段 a上作了函数运算之后 排序的规则是否仍旧一样? a < b 与 f(a) < f(b)是否等价?
其次 就算f(a)和a的排序规则一样 但是索引块中存的a 但是你传给它的是经过了函数运算的值:vfa 只有oracle知道函数f的反函数inv_f 并在vfa上做inv_f(:vfa)计算之后 才能通过索引的B树结果进行查找
当然 现实中f可能不是显示的 而是隐式的 如传入参数和字段类型不匹配的情况下 Oracle可能在字段上作函数运算 从语句上可能看不出索引字段上被做了函数运算 但Oracle内部已经在字段上运用了函数 这样也会导致索引不可用 这种情况下用hint强制使用索引也是没用的
通过dbms_xplan display_cursor可以或许可以查看到这种隐式类型转换
通过v$sql_bind_metadata应当可以查看到每个绑定变量的类型
通过v$sql_bind_capture这个视图甚至可以看到每个绑定变量具体的值 不要把bind_capture和bind peek搞混哦 而且这里bind_cature也不会每绑定一次变量就capture一次 不然对执行量非常高 绑定频繁的语句 capture以同样频率进行的话 开销可能还是有点大的
上面讲到了索引的有序性 下面来讲讲索引另外一个有趣的性质 其实 我们完全可以把索引看作一张表 这张表包含和主表一样多的记录(如果不考虑null) 只不过每条记录只有主表的部分字段 开个玩笑 我们是不是可以把索引叫做有序视图呢?或者一点 有序物化视图:)
那么 我在执行一些查询的时候 如果所有字段都包含在索引中 是不是只要访问索引就可以了呢?
那么 根据业务的需求 我们是不是可以设计或调整索引以减少对主表的访问呢?或者 是不是可以适当的调整应用的设计或实现来满足索引呢?
同时 考虑到索引的有序性 是不是可以利用索引来避免排序呢?
当然 我们不能忽略null的存在 如果一条记录在索引中的所有字段上都是null的 那么oracle是不会索引这条记录的 比如如果记录ri的ai bi ci字段都是null的 索引中是找不到这条记录的 这会有什么问题呢?首先表中的记录和索引中的记录从数量上来说就不一样了
考虑一下Oracle会怎样执行下面这个查询:
select count() from tx;
这个呢 hint起作用了吗?
select /+ parallel(tx ) / count() from tx;
大家可以测试一下 怎样把count()这个作并行化 从这里或许可以得到一些Oracle怎么处理hint的提示
讲一下Oracle CBO计算索引访问成本的公式
cost =
bll +
ceiling(leaf_blocks effective index selectivity) +
ceiling(clustering_factor effective table selectivity)
这个公式相信很多地方可以找到(我是从cost base oracle fundamentals这本书里copy出来的) 简单说一下我自己对这个公式的理解
bll是索引树的高度
leaf_blocks是索引的页子的个数
effective index selectivity (eis)怎么算呢?
还是举几个例子
where a = :va and b = :vb c = :vc
这里eis是 (selectivity a) (selectivity b) (selectivity c)
where a = :va and c = :vc
这里eis是 selectivity a
where b = :vb and c = :vc
这里eis是
where a = :va and b >= :vb and c = :vc
这里eis是 (selectivity a) (selectivity range b)
就是说按索引字段的顺序 个不在where条件中出现的字段 或者个做了范围运算的字段 之后出现的字段的selectivity是不能乘到effective index selectivity里去的
clustering_factor表示的是按索引的顺序 从头走到尾 需要访问多少次数据块 这里需要考虑到Oracle的一个优化 如果连续n条记录在同一个表块中 那么oracle认为只需要访问一次数据块
那么clustering_factor的值的范围就很容易确定了 cf >= table blocks and cf <= rows in index
effective table selectivity 这个计算就容易了 把索引中所有字段的selectivity乘起来就可以了
如果查询中还有其它条件 比如 d = :vd and e = :ve 但是d e这些字段又不在索引中 那么在这些列上的过滤条件 需要回表后把这些值取出来才能判断 所以d e这些列的selectivity是不能乘到effective table selectivity里去的
ceiling(clustering_factor effective table selectivity)表示需要回表的次数
所以上面索引访问的cost就是走某个索引 需要访问的数据块的个数
当然 前面的讨论忽略了index skip scan这种情况 因为本人对index skip scan也不是很明白
什么情况下会走skip scan?
select from tx where a = :va and c = :vc 是不是会在c这个字段上也作一个skip scan呢?
lishixinzhi/Article/program/Oracle/201311/16730
ORACLE的表索引失效,需要重建, 如何查看表里是否有数据?
q ) select from tx where b = :vb and c = :vc;ORACLE的表索引失效,需要重建, 如何查看表里是否有数据?
数据在 内存里,只要是存在物理存储设备上的数据都是干净的。 ]
initrans 1索引失效并不会影响表中的数据的。
无DBA权限查看oracle表空间大小
你可以做个试验,写个SQL语句,看执行就知道了。没有DBA的权限,只能查看你自己的表空间的大小等.
Britten Park Rose Bed Spray只能查看v$以user开头的视图,也就是你自己用户下的一些相关的表空间,角色,对象等.
例如楼上列举的哪些
我给你解释一下他的哪些意思吧
select from USER_TABLESPACES;就是查看你自己能访问的表空间
select from USER_TAB_PARTITIONS;查看你自己用户下表分区
select from USER_EXTENTS;查看你自己用户下的区
select from USER_INDEXES;查看你自己用户所能访问的索引
select from USER_IND_PARTITIONS; 查看自己用户下的索引分区
select from USER_TABLESPACES;
select from USER_TAB_PARTITIONS;
select from USER_EXTENTS;
select from USER_INDEXES;
select from USER_IND_PARTITIONS;
Oracle 域索引状态为INPROGRS
| 0 | SELECT STATEMENT | | 1 | 28 | 2 (0)| 00:00:01 |正在创建状态的索引为INPROGRS。
Connected to:如果会话因为任何原因断开,但是索引仍然处于INPROGRS状态。
需要使用带FORCE的删除语句进行删除。例如:
DROP INDEX index_name FORCE;
Oracle 函数索引 TO_CHAR
Oracle 自动使用并维护索引 插入 删除 更新表后 自动更新索引因为这是优化器决定的,你SELECT一下它会自己判断是用走索引快还是全表扫描快,要是你数据量大了,他肯定走索引,你可以试试。
具体的可以去了索引的列为主键列。 并且当库表某些列名或者库表名改变时候,解下ORACLE的优化器
Oracle索引怎么使用
问题有点没太看明白,能详细描述一下么?select t.INDEX_NAME,t.COLUMN_NAME,i.index_typeOracle索引使用
Oracle提供一个索引的方法 来确定索引是否被使用 如果索引没有被使用 就可以删除它们以减少不必要的语句的开销 因为表上的大量不必要的索引可能会降低DML语句的性能 给数据库性能产生压力 所以生产环境上 以根据业务增长情况定期 分析数据库索引的使用 特别是一些大表上的索引 提升数据库事务提交的性能 查看表上的索引 SQL> Selectindex_name table_name num_rows From dba_indexes i Where i table_name = WEBSITE_VIEW_TB ; INDEX_NAME TABLE_NAME NUM_ROWS CURRTIME_IDX WEBSITE_VIEW_TB ORDERNO_IDX WEBSITE_VIEW_TB ORDERSOURCE_IDX WEBSITE_VIEW_TB 开启索引 SQL> ALTER INDEX CURRTIME_IDX MONITORING USAGE; Index altered 查看索引 SQL> Select From v$object_usage; INDEX_NAME TABLE_NAME MONITORING USED START_MONITORING END_MONITORING CURRTIME_IDX WEBSITE_VIEW_TB YES NO / / : : 注意 如果开启了索引功能 用v$object_usage视图可以查看正在被的索引记录 USED列表示在开启索引过程中索引是否被使用 MONITORING列表示是否开启了索引 START_MONITORING表示开启索引的开始时间 END_MONITORING表示开启索引的结束时间 执行查询语句 使用被的索引 SQL> Select Count() From log WEBSITE_VIEW_TB t Where t currtime beeen to_date( yyyy mm dd )And to_date( yyyy mm dd ); COUNT() 可以看到记录的USED列值变成了YES 表示索引被使用过 SQL> Select From v$object_usage; INDEX_NAME TABLE_NAME MONITORING USED START_MONITORING END_MONITORING CURRTIME_IDX WEBSITE_VIEW_TB YES YES / / : : 分析完毕后 关闭索引 因为也会占用一定的资源 SQL> ALTER INDEX CURRTIME_IDX NOMONITORING USAGE; Index altered 可以看到MONITORING列变为NO END_MONITORING列被填充 索引停止 SQL> Select From v$object_usage; INDEX_NAME TABLE_NAME MONITORING USED START_MONITORING END_MONITORING CURRTIME_IDX WEBSITE_VIEW_TB NO YES / / : : / / : : 再次执行查询 记录无变化 SQL> Select Count() From log WEBSITE_VIEW_TB t Where t currtime beeen to_date( yyyy mm dd ) And to_date( yyyy mm dd ); COUNT() SQL> Select From v$object_usage; INDEX_NAME TABLE_NAME MONITORING USED START_MONITORING END_MONITORING CURRTIME_IDX WEBSITE_VIEW_TB NO YES / / : : / / : : 再次开启索引 相应记录值又发生了变化 SQL> ALTER INDEX CURRTIME_IDX MONITORING USAGE; Index altered SQL> Select From v$object_usage; INDEX_NAME TABLE_NAME MONITORING USED START_MONITORING END_MONITORING CURRTIME_IDX WEBSITE_VIEW_TB YES NO / / : : 虽然v$object_usage表能记录索引和使用的状态 但它不能统计索引被使用的次数和频率 只记录了在开启索引的时间段索引是否被使用过 这一点要值的注意 lishixinzhi/Article/program/Oracle/201311/19069
oracle的索引有几种
在一颗 B 树中,通常索引条目和行之间存在一种一对一的关系:一个 索引条目就指向一行。而对于位图索引,一个索引条目则使用一个位图同时指向多行。位图索引适用于高度重复而且通常只读的数据(高度重复是指相对于表中的总行数,数据只有很少的几个不同值)。考虑在一 个有 100 万行的表中,每个列只有 3 个可取值: Y 、 N 和 NULL 。举例来说,如果你需要频繁地统计多少行有值Y ,这就很适合建立位图索引。不过并不是说如果这个表中某一列有 11.000 个不同的值就不能建立位图索引,这一列当然也可以建立 位图索引。在一个 OLTP 数据库中,由于存在并发性相关的问题,所以不能考虑使用位图索引(后面我们就会讨论这一点)。注意,位图索引要求使用 Oracle 企业版或个人版。Oracle 提供了多种不同类型的索引以供使用。简单地说, Oracle 中包括如下索引:
1、 B 树索引
这些是我所说的 “ 传统 “ 索引。到目前为止,这是 Oracle 和大多数其他数据库中最常用的索引。 B 树的构造类似于二叉树,能根据键提供一行或一个行集的快速访问,通常只需很少的读作就能找到正确的行。不过,需要注意重要的一点, ” B 树 “ 中的 ” B “ 不代表二叉( binary ),而代表平衡( b alanced )。B 树索引并不是一颗二叉树,这一点在介绍如何在磁盘上物理地存储 B 树时就会了解到。 B 树索引有以下子类型:
索引组织表( index organized table ):索引组织表以 B 树结构存储。堆表的数据行是以一种无组织的方式存储的(只要有可用的空间,就可以放数据),而 IOT 与之不同, IOT 中的数据要按主键的顺序存储和排序。对应用来说, IOT 表现得与 “ 常规 “ 表并无二致;需要使用 SQL 来正确地访问 IOT 。 IOT 对信息获取、空间系统和 OLAP 应用最为有用。 IOT 在上一章已经详细地讨论过。
B树聚簇索引( Btree cluster index )这些是传统 B 树索引的一个变体(只是稍有变化)。 B 树聚簇索引用于对聚簇键建立索引(见第 11. 章中 “ 索引聚簇表 “ 一节),所以这一章不再讨论。在传统 B 树中 ,键都指向一行;而 B 树聚簇不同,一个聚簇键会指向一个块,其中包含与这个聚簇键相关的多行。
降序索引( descending index ):降序索引允许数据在索引结构中按 “ 从大到小 “ 的顺序(降序)排序,而不是按 ” 从小到大 “ 的顺序(升序)排序。我们会解释为什么降序索引很重要,并说明降序索引如何工作。
反向键索引( rrse key index ):这也是 B 树索引,只不过键中的字节会 “ 反转 “ 。利用反向键索引,如果索引中填充的是递增的值,索引条目在索引中可以得到更均匀的分布。例如,如果使用一个序列来生成主键,这个序列将生成诸如 987500 、 987501 、 987502 等值。这些值是顺序的,所以倘若使用一 个传统的 B 树索引,这些值就可能放在同一个右侧块上,这就加剧了对这一块的竞争。利用反向键, Oracl e则会逻辑地对 205789 、 105789 、 005789 等建立索引。 Oracle 将数据放在索引中之前,将先 把所存储数据的字节反转,这样原来可能在索引中相邻放置的值在字节反转之后就会相距很远。通过反转字节,对索引的插入就会分布到多个块上。
2、 位图索引( bitmap index )
位图联结索引( bitmap join index ):这为索引结构(而不是表)中的数据提供了一种逆规范化的 方法。例如,请考虑简单的 EMP 和 DEPT 表。有人可能会问这样一个问题: “ 多少人在位于波士顿的部门工作 ?“ EMP 有一个指向 DEPT 的外键,要想统计 LOC 值为 Boston 的部门中的员工人数,通常必须完成表联结,将 LOC 列联结至 EMP 记录来回答这个问题。通过使用位图联结索引,则可以在 EMP 表上对 LOC 列建立索引 。
3、 基于函数的索引( function-based index )
这些就是 B 树索引或位图索引,它将一个函数计算得到的结果存储在行的列中,而不是存储列数据本身。可以把基于函数的索引看作一个虚拟列(或派生列)上的索引,换句话说,这个列并不物理存储在表中。基于函数的索引可以用于加快形如 SELECT FROM T W HERE FUNCTION(DATABASE_COLUMN) = SAME_VALUE 这样的查询,因为值 FUNCTION(DATABASE_COLUMN) 已经提前计算并存储在索引中。
4、 应用域索引( application domain 上面的select .. from xx 已经是最简单的SQL语句啦...index )
应用域索引是你自己构建和存储的索引,可能存储在Oracle 中,也可能在 Oracle 之外。你要告诉优化器索引的选择性如何,以及执行的开销有多大,优化器则会根据你提供的信息来决定是否使用你的索引。 Oracle 文本索引就是应用域索引的一个例子;你也可 以使用构建 Oracle 文本索引所用的工具来建立自己的索引。需要指出,这里创建的 “ 索引 “ 不需要使用传统的索引结构。例如, Oracle 文本索引就使用了一组表来实现其索引概念。
5、HASH索引
使用HASH索引必须要使用HASH群集。建立一个群集或HASH群集的同时,也就定义了一个群集键。这个键告诉Oracle如何在群集上存储表。在存储数据时,所有与这个群集键相关的行都被存储在一个数据库块上。若数据都存储在同一个数据库块上,并且使用了HASH索引,Oracle就可以通过执行一个HASH函数和I/O来访问数据——而通过适用一个二元高度为4的B-树索引来访问数据,则需要在检索数据时使用4个I/O。
技巧:HASH索引在有限制条件(需要指定一个确定的值而不是一个值范围)的情况下非常有用。
6、分区索引
分区索引就是简单地把一个索引分成多个片断,这样可以访问更小的片断,并且可以把这些片断分别存放在不同的硬盘上(避免I/O问题)。B-数索引和位图索引都可以被分区,HASH索引不可以被分区。
有两种类型的分区索引:本地分区索引和全局分区索引。每个类型都有两个子类型,有前缀索引和无前缀索引。如果使用了位图索引就必须是本地索引。
把索引分区最主要的原因是可以减少所需读取的索引的大小,另外把分区放在不同的表空间中可以提高分区的可用性和可靠性。
Oracle数据库中的索引详解
minextents 1一 ROWID的概念
存储了row在数据文件中的具 置 位编码的数据 A Z a z + 和 /
row在数据块中的存储方式
SELECT ROWID last_name FROM hr employees WHERE department_id = ;
比如 OOOOOOFFFBBBBBBRRR
OOOOOO data object number 对应dba_objects data_object_id
BBBBBB block#
RRR row#
Dbms_rowid包
具体到特定的物理文件
二 索引的概念
类似书的目录结构
Oracle 的 索引 对象 与表关联的可选对象 提高SQL查询语句的速度
索引直接指向包含所查询值的行的位置 减少磁盘I/O
与所索引的表是相互的物理结构
语法 CREATE INDEX index ON table (column[ column] );
B tree结构(非bitmap)
[一]了解索引的工作原理
表 emp
目标 查询Frank的工资salary
建立索引 create index emp_name_idx on emp(name);
[试验]测试索引的作用
运行/rdbms/admin/utlxplan 脚本
建立测试表
create table t as select from dba_objects;
insert into t select from t;
create table indextable
as select rownum id owner object_name subobject_name
object_id data_object_id object_type created
from t;
set autotrace trace explain
分析表 可以得到cost
查询 object_name= DBA_INDEXES
再查询
[思考]索引的代价
插入 更新
三 索引
何时创建 当某列任意两行的值都不相同
当建立Primary Key(主键)或者Unique constraint(约束)时 索引将被自动建立
语法 CREATE UNIQUE INDEX index ON table (column);
演示
四 组合索引
何时创建 当两个或多个列经常一起出现在where条件中时 则在这些列上同时创建组合索引
组合索引中列的顺序是任意的 也无需相邻 但是建议将最频繁访问的列放在列表的最前面
演示(组合列 单独列)
五 位图索引
何时创建
列中有非常多的重复的值时候 例如某列保存了 性别 信息
Where 条件中包含了很多OR作符
较少的update作 因为要相应的跟新所有的bitmap
结构 位图索引使用位图作为键值 对于表中的每一数据行位图包含了TRUE( ) FALSE( ) 或NULL值
优点 位图以一种压缩格式存放 因此占用的磁盘空间比标准索引要小得多
语法 CREATE BITMAP INDEX index ON table (column[ column] );
掩饰
create table bitmaptable as select from indextable where owner in( SYS PUBLIC );
分析 查找 建立索引 查找
六 基于函数的索引
何时创建 在WHERE条件语句中包含函数或者表达式时
函数包括 算数表达式 PL/SQL函数 程序包函数 SQL函数 用户自定义函数
语法 CREATE INDEX index ON table (FUNCTION(column));
演示
必须要分析表 并且query_rewrite_enabled=TRUE
或者使用提示/+ INDEX(ic_index)/
七 反向键索引
目的 比如索引值是一个自动增长的列
多个用户对集中在少数块上的索引行进行修改 容易引起资源的争用 比如对数据块的等待 此时建立反向索引
性能问题
语法
八 键压缩索引
比如表landscp的数据如下
site feature job
Britten Park Rose Bed Prune
Britten Park Shrub Bed Mulch
Britten Park Shrub Bed Weed
Britten Park Shrub Bed Hoe
……
查询时 以上 列均在where条件中同时出现 所以建立基于以上 列的组合索引 但是发现重复值很多 所以考虑压缩特性
Create index zip_idx
on landscp(site feature job)
press ;
将索引项分成前缀(prefix)和后缀(tfix)两部分 前两项被放置到前缀部分
Prefix : Britten Park Rose Bed
Prefix : 重建为标准索引 反之不行Britten Park Shrub Bed
实际所以的结构为
Prune
Mulch
Mulch
Weed
Hoe
特点 组合索引的前缀部分具有非选择性时 考虑使用压缩 减少I/O 增加性能
九 索引组织表(IOT)
将表中的数据按照索引的结构存储在索引中 提高查询速度
牺牲插入更新的性能 换取查询性能 通常用于数据仓库 提供大量的查询 极少的插入修改工作
必须指定主键 插入数据时 会根据主键列进行B树索引排序 写入磁盘
十 分区索引
簇:
A cluster is a group of tables that share the same data blocks because they share mon columns and are often used toger
lishixinzhi/Article/program/Oracle/201311/17769
oracle 多字段索引和单字段索引
COUNT(1)在oracle中物理结构不一样。
create index INDEX_NAME on TABLE_NAME (ACCNO, ZONENO, CINO)
会根据ACCNO, ZONENO, CINO生成一个BTree索引树。
create index INDEX_NAME on TABLE_NAME (ACCNO)。
create index INDEX_NAME on TABLE_NAME (ZONENO)。
create index INDEX_NAME on TABLE_NAME (CINO)。
会生成3个索引树。如果根据ACCNO, ZONENO, CINO三个字段检索,正常情况下(ACCNO, ZONENO, CINO)会快一些。
如果按照ACCNO中的一个字段检索,下面的情况会快一些。
如果在同时建上面两种情况的检索,也不会报错。只是会在DML,更新插入删除时会慢一些。试图考虑下bitmap索引,可能也能对你的业务有用。
扩展资料:(4) create index 索引名 on 表名 (字段1,字段2......字段n);
索引使用原则:
在正确使用索引的前提下,索引可以提高检索相应的表的速度。当用户考虑在表中使用索引时,应遵循下列一些基本原则。
(1)在表中插入数据后创建索引。在表中插入数据后,创建索引效率将更高。如果在装载数据之前创建索引,那么插入每行时oracle都必须更改索引。
(2)索引正确的表和列。如果经常检索包含大量数据的表中小于15%的行,就需要创建索引。为了改善多个表的相互关系,常常使用索引列进行关系连接。
(3)主键和关键字所在的列自动具有索引,但应该在与之关联的表中的外部关键字所在的列上创建索引。