应该在ORACLE数据库的哪些字段上建立索引where_第1页
应该在ORACLE数据库的哪些字段上建立索引where_第2页
应该在ORACLE数据库的哪些字段上建立索引where_第3页
应该在ORACLE数据库的哪些字段上建立索引where_第4页
应该在ORACLE数据库的哪些字段上建立索引where_第5页
已阅读5页,还剩16页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、给数据库建索引的规则博客分类: Oracle建立索引常用的规则如下:1、表的主键、外键必须有索引;2、数据量超过300的表应该有索引;3、经常与其他表进行连接的表,在连接字段上应该建立索引;4、经常出现在 Where子句中的字段,特别是大表的字段,应该建立索引;5、索引应该建在选择性高的字段上;6、索引应该建在小字段上,对丁大的文本字段甚至超长字段,不要建索引;7、复合索引的建立需要进行仔细分析;尽量考虑用单字段索引代替:A、正确选择复合索引中的主列字段,一般是选择性较好的字段;B、复合索引的几个字段是否经常同时以 ANM式出现在 Where子句中?单字段 查询是否极少甚至没有?如果是,则可以

2、建立复合索引;否则考虑单字段索引;C、如果复合索引中包含的字段经常单独出现在 Where子句中,则分解为多个单 字段索引;口如果复合索引所包含的字段超过 3个,那么仔细考虑其必要性,考虑减少复 合的字段;E、如果既有单字段索引,乂有这几个字段上的复合索引,一般可以删除复合索 引;8、频繁进行数据操作的表,不要建立太多的索引;9、删除无用的索引,避免对执行计划造成负面影响;以上是一些普遍的建立索引时的判断依据。一言以蔽之,索引的建立必须慎重, 对每个索引的必要性都应该经过仔细分析, 要有建立的依据。因为太多的索引与 不充 分、不正确的索引对性能都毫无益处:在表上建立的每个索引都会增加存 储开销,

3、索引对丁插入、删除、更新操作也会增加处理上的开销。另外,过多的复合索引,在有单字段索引的情况下,一般都是没有存在价值的;相反,还会 降低数据增加删除时的性能,特别是对频繁更新的表来说,负面影响更大ORACL查询的优化及索弓|作者:guojunfeng 提交日期:2006-9-17 1:07:001.合理使用索引它的根本目的就是为了提高查询效率。现 在大多数的数据库产品都采用旧M最先提出的ISAM索引结构。索引的使用要恰 到好处,其使用原则如下:在经常进行连接,但是没有指定为外键的列 小立索引|,而不经常连接的 字段则由优化器自动生成索引。在频繁进行排序或分组(即进行group by或order

4、 by操作)的歹U 建立 索引|。在条件表达式中经常用到的不同值较多的列 建立检索,在不同值少的列 不要企立索引|。比如在雇员表的“性别”列只有“男”与“女”两个不同 值,因此就无必要建立索引|。如果建立索引|不但不会提高查询效率,反而会严重 降低更新速度。在这些歹0 建立复合索引(compound index )。Informix 数据库有一个tbcheck工具,可以在可疑的 索引进行检查。在一些数据库服务器,索引可能失效或者因为频繁操作而使 得读取效率降低,如果一个使用索引的查询不明不白地慢下来,可以试着用 tbcheck工具检查索引的完整性,必要时进行修复。另外,当数据库表更新大量 数据

5、后,删除并重建索引可以提高查询速度。(1)在下面两条select语句中:select * from table1where field1<=10000 and field1>=0;select * from table1where field1>=0 and field1<=10000;如果数据表中的数据field1都>=0,则第一条select语句要比第二条 select语句效率高的多,因为第二条select语句的第一个条件耗费了大量的系 统资源。第一个原则:在where子句中应把最具限制性的条件放 在最前面。在下面的select语句中: select* fro

6、m tab where a=, and b=, and c=,;若有索引index(a,b,c),则where子句中字段的顺序应和索引中字段顺序致。在 field1(3) |select field3,field4 from tb* from tb在索引扫描后要多一步有唯一索引I1 ,在field2有非唯一索引I2。快selectwhere field1='sdfwhere field1='sdf慢,ROWIDt 访问。(4) select field3,field4 from tb select field3,field4 from tbwhere field1>=&#

7、39;sdfwhere field1>'sdf慢(5) select field3,field4 from tbselect field3,field4 from tb因为后者不使用索引。where field2 like 'R%' where field2 like '%R'快 慢,使用函数如:select field3,field4 from tbwhere upper(field2)='RMN'建议不使用函数;如果一个表有五万条以记录, 严格禁止使用函数!两万条记录以下没有限制。不使用索引。(7)空值不在索引中存储,所以sel

8、ect field3,field4 from tbwhere field2 isnot null不使用索引。(8)不等式如select field3,field4 from tb相似地,select field3,field4 from tb引。where field2!='TOM'不使用索引where field2 not in('M','P')不使用索第二个原则:where子句中字段的顺序应和索引中字段顺序一致。(9) 多列索引,只有当查询中索引首列被用丁条件时,索引才能被使用。(10) MAX, MIN等函数,如Select max(fie

9、ld2) from tb使用索引。所以,如果需要对字段取ma*min, sum等,应该加索引。select“min” =min(field1),“maX* =max(field1) from tbselect“min" =(select min(field1) from tb) ,“maX* =( selectmax(field1) from tb)(11) 重复值过多的索引不会被查询优化器使用。而且因为建了索引,修改 该字段值时还要修改索引,所以更新该字段的操作比没有索引更慢。(12) 索引值过大(如在一个char(40)的字段建索引),会造成大量的I/O 开销(甚至会超过表扫描的

10、I/O开销)。因此,尽量使用整数索引。Sp_estspace 可以计算表和索引的开销。(13) 对丁多列索引,order by的顺序必须和索引的字段顺序一致。(14) 在sybase中,如果order by的字段组成一个簇索引,那么无须做order by。记录的排列顺序是与簇索引一致的。(15) 多表联结(具体查询方案需要通过测试得到)where子句中限定条件尽量使用相关联的字段,且尽量把相关联的字段放 在前面。select a.field1,b.field2 from a,b where a.field3=b.field31. field3*有索引的情况下:对a作全表扫描,结果排序对b作全表

11、扫描,结果排序结果合并。对丁很小的表或巨大的表比较合适。2. field3 索弓 I按照表联结的次序,b为驱动表,a为被驱动表对b作全表扫描对a作索引范围扫描如果匹配,通过a的rowid访问(16) 避免一对多的join。如:select tb1.field3,tb1.field4,tb2.field2 from tb1,tb2wheretb1.field2=tb2.field2 and tb1.field2= 'BU1032 and tb2.field2= 'aaa'不如:declare a varchar(80)select a=field2 from tb2 wh

12、ere field2=' aaa'select tb1.field3,tb1.field4,a from tb1where field2='aaa'(16) 子查询用 exists/not exists 代替 in/not in 操作比较:selecta.field1 from a where a.field2in( selectb.field1from b whereb.field2=100) selecta.field1 from awhere exists(select1 from bwherea.field2=b.field1 and b.field2=

13、100)selectfield1 from awhere field1 not in(selectfield2 from b)selectfield1 from awhere not exists( select 1 from b whereb.field2=a.field1)(17) 主、外键主要用丁数据约束,sybase中创建主键时会自动创建索引, 外键与索引无关,提高性能必须再建索引。(18) char类型的字段不建索引比int类型的字段不建索引更糟糕。建索引 后性能只稍差一点。(19) 使用count(*)而不要使用count(column_name),避免使用 count(disti

14、nct column_name) 。(20) 等号右边尽量不要使用字段名,如:select * from tb where field1 = field3(21) 避免使用or条件,因为or不使用索引。2. 避免使用order by 和group by字句。因为使用这两个子句会占用大量的临时空间(tempspace),如果一定要使 用,可用视图、人工生成临时表的方法来代替。如果必须使用,先检查memory tempdb的大小。测试证明,特别要避免一个查询里既使用 join 乂使用group by ,速度会 非常慢!3. 尽量少用子查询,特别是相关子查询。因为这样会导致效率下降。在主查询和whe

15、re子句中的查询中出现,那么很可能当主 查询中的列值改变之后,子查询必须重新查询一次。查询嵌套层次越多,效率越 低,因此应当尽量避免子查询。如果子查询不可避免,那么要在子查询中过滤掉 尽可能多的行。4. 消除对大型表行数据的顺序存取在嵌套查询中,对表的顺序存取对查询效率可能产生致命的影响。比如采用 顺序存取策略,一个嵌套3层的查询,如果每层都查询100。行,那么这个查询 就要查询10亿行数据。避免这种情况的主要方法就是对连接的列进行索引。例 如,两个表:学生表(学号、姓名、年龄,,)和选课表(学学、课程号、成绩)。 如果两个表要做连接,就要在“学号”这个连接字段小立索引|。尽管在所有的检香列都

16、有索引,但某些 形式的where子句强迫优化器使用顺序存取。下面的查询将强迫对orders表执SELECT* FROM orders WHER£ustomer_num=104 AND order_num>1001) OR order_num=1008在customer_num和order_num 建有索引,但是 在面的语句中优化 器还是使用顺序存取si径扫描整个忘因为这个语句要检索的是分离的行的集 合,所以应该改为如下语句:SELECT* FROM orders WHEREustomer_num=104 AND order_num>1001 UNIONSELECT* FR

17、OM orders WHER6rder_num=10085. 避免困难的正规表达式MATCHES LIKE关键字支持通配符匹配,技术 叫正规表达式。但这种匹 配特别耗费时间。例如:SELECT* FROM customer WHEREipcode LIKE"98_在zipcode字段建立了索引,在这种情况下也还是采用顺序扫描的方 式。如果把语句改为 SELECT* FROM customer WHEREipcode > “98000”, 在执行查询时就会利用索引来查询,显然会大大提高速度。还要避免非开始的子申。例如语句:SELECT* FROMsustomer WHERE zi

18、pcode2 , 3 > “80”,在where子句中采用了非开始子申,因而这个语句也 不会使用索引。6. 使用临时表加速查询有时能加速查询。它有助丁避免多 重排序操作,而且在其他方面还能简化优化器的工作。例如:SELECT , rcvbles.balance , ,other columnsFROM cust rcvblesWHEREust.customer_id = rcvlbes.customer_idAND rcvblls.balance>0AND cust.post code> “98000"ORDER BY 可以把所有

19、未付款的客户找出来放 在一个临时文件中,并按客户的名字进行排序:SELECT , rcvbles.balance , ,other columnsFROM cust rcvblesWHEREust.customer_id = rcvlbes.customer_idAND rcvblls.balance>0ORDER BY INTO TEMP cust_with_balance在临时表中查询:SELECT* FROM cust_with_balanceWHERE)ostcode> “98000”而且物理顺序就是所要求的顺序,减少了 磁盘I/O ,所

20、以查询工作量可以得到大幅减少。临时表创建后不会反映主表的修改。在主表中数据频繁修改的情况下, 注意不要丢失数据。7. 用排序来取代非顺序存取在磁盘存取臂的来回移动。SQL语句隐藏了这一情况,使得我们在写应用程序时很容易写出要求存取大量非顺序贞的查ORACLE索引与高性能SQL介绍什么是索弓索引I是建立在表的一列或多个列上的辅助对象,目的是加快访问表中的数据;Oracle存储索引的数据结构是B*树,位图索引也是如此,只不过是叶子节点不同B*数索引I;索引由根节点、分支节点和叶子节点组成,节点包含索引嗷据和确定行实际位置 的rowid。上级家引块包含下级索引块的密引数据,叶使用索引的目的 加快查询

21、速度 减少I/O操作 消除磁盘排序何时使用索引查询返回的记录数排序表40%非排序表7%表的碎片较多(频繁增加、删除)索引|的种类非唯一索引(最常用) 唯一索弓位图索引局部有前缀分区索引 局部无前缀分区索引 全局有前缀分区索引 散列分区索引 基于函数的索引管理索引的准则在表中插入数据后创建索弓。在用SQL*Loader或import工具插入或装载数据后,建立 索引比较有效;索引正确的表和列。经常检索排序大表中40%或非排序表7%的行,建议建 索引。为了改善多表关联,索引|列用于联结;。列中的值相对比较唯一;。取值范围(大:B*树索引,小:位图索引|);。Date型列一般适合基于函数的|索引|;。

22、列中有许多空值,不适合建立 索引为性能而安排 索引列。经常一起使用多个 字段检索记录,组合 索引|比单|索引|更有效;。把最常用的列放在最前面,例:dx_groupid_serv_id(groupid,serv_id),在where条件中 使用groupid或groupid,serv_id,查询将使用索引,若仅用到serv_id字段,则|索引|无效;。合并/拆分不必要 的索引|。限制每个表索引的数量。一个表可以有几百个 索引(你会这样做吗|?),但是对于频繁插入和更新表,索引越多系统CPU, I/O负担就越重;。建议每张表不超过 5个依引。删除不再需要的索引。索引无效,集中表现在该使用基于函数

23、的索引或位图索引,而使用了 B*树|索引|;。应用中的查询不使用 索引;。重建黑引之前必须先删除索引若用alter index - rebuild重建索引,贝U不必删除索 引。索弓数据块空间使用。创建索引时指定表空间,特别是在建立主键时,应明确指定表空间;。合理设定pctfress,注意:不能给 索引指定pctused;。估计贤引的大小和合理地设置存储参数,默认为表空间大小,或 initial与next设置 成一样大。考虑并行创建索弓。对大表可以采用并行创建 索引,在并行创建索引|时,存储参数被每个查询服务器进程 分别使用,例如:initial为1M,并行度为8,则创建索引期间至少要消耗8M空

24、间;考虑用nologging创建索引。对大表创建 索引可以使用nologging来减少重做日志;。节省重做日志文件 的空间;。缩短创建索弓的时间;。改善了并行创建大索引|时的性能。怎样建立最佳索引明确地创建索引create index index_name on table_name(field_name)tablespace tablespace_namepctfree 5initrans 2maxtrans 255storage(minextents 1maxextents 16382pctincrease 0);创建基于函数的索引。常用与 UPPER、LOWER、TO_CHAR(date

25、)等函数分类上,例:create index idx_func on emp (UPPER(ename) tablespace tablespace_name;创建位图索弓。对基数较小,且基数相对稳定的列建立索引时,首先应该考虑位图 索引|,例:create bitmap index idx_bitm on class (classno) tablespace tablespace_name;明确地创建唯一索弓。可以用create unique index语句来创建唯一 索引,例:create unique index dept_unique_idx on dept(dept_no) tabl

26、espace idx_1;创建与约束相关的索弓。可以用using index字句,为与unique和primary key约束相关的索弓例如: alter table table_nameadd constraint PK_primary_keyname primary key (field_name)using index tablespace tablespace_name;如何创建局部分区索引。基础表必须是分区表;。分区数量与基础表相同;。每个索引分区的子分区数量与相应 的基础表分区相同;。基础表的子分区中的行的f引项,被存储在该 索引的相应的子分区中,例如:Create Index T

27、G_CDR04_SERV_ID_IDX On TG_CDR04(SERV_ID)Pctfree 5Tablespace TBS_AK01_IDXStorage (MaxExtents 32768PctIncrease 0FreeLists 1FreeList Groups 1)local/如何创建范围分区的全局索弓。基础表可以是全局表和分区表。create index idx_start_date on tg_cdr01(start_date)global partition by range(start_date)(partition p01_idx vlaues less than (&#

28、39;0106')partition p01_idx vlaues less than (0111)partition p01_idx vlaues less than ('0401')/重建现存的索弓重建现存的索引|的当前时刻不会影响查询;重建引可以删除额外 的数据块;提高索引查询效率;alter index idx_name rebuild nologging;对于分区索引:alter index idx_name rebuild partition partiton_name nologging;要删除索引|的原因。不再需要的索引;。索引没有针对其相关 的表所发布

29、的查询提供所期望 的性能改善;。应用没有用该索引I来查询数据;。该I索引无效,必须在重建之前删除该索引。该I索引i已经变的太碎了,必须在重建之前删除该索引|;。语句: drop index idx_name;drop index idx_name drop partition partition_name;建立肾引|的代价基础表维护时,系统要同时维护 索引|,不合理的索引|将严重影响系统资源,主要表现在CPU 和 I/O 上;插入、更新、删除数据产生大量 db file sequential read锁等待;SQL优化器简介基于规则的优化器。总是使用索引。总是从驱动表开始(from子句最右边的

30、表)。只有在不可避免 的情况下,才使用全表扫描。任何索弓|都可以基于成本的优化器。需要表、索引的统计资料Analyze table customer compute statistics;Analyze table customer estimate statistics sample 5000 rows;。表中设置并行度、表分区优化器模式rule模式。总忽略CBO和统计信息而基于规则choose模式。 Oracle 根据情况选择 rule or first_rows or all_rowsfirst_rows 模式。基于成本,以最快 的速度返回记录,会造成总体查询速度的下降或消耗更多 的资源

31、,倾向索引扫描,适合OLTP系统all_rows 模式。基于成本,确保总体查询时间最短,倾向并行全表扫描例如:Select last_name from customer order by last_name;用 first_rows 时,迅速返回记录, 但 I/O 量大,用all_rows时,返回记录慢,但使用资源少。调整SQL表访问全表扫描。返回记录:未排序表40%,排序表7%,建议采用并行机制来提高访问速度,DDS;索弓访问。最常用的方法,包括 索弓隹一扫描和 索引范围扫描,OLTP;快速完全索引扫描。访问索引中所有数据块,结果相当于全表扫描,可以用索引扫描代替全表扫描,例如:Selec

32、t serv_id,count(* ) from tg_cdr01 group by serv_id;评估全表扫描的合法性如何实现并行扫描。永久并行化(不推荐)alter table customer parallel degree 8;。单个查询并行化select /*+ full(emp) parallel(emp,8)*/ * from emp;分区表效果明显优化SQL语句排序排序的操作:。order by 子句。group by 子句。selectdistinct 子句。创建索引时。union 或 minus。排序合并连接如何避免排序。添加索引。在 索引中使用distinct子句。避免

33、排序合并连接使用提示进行调整使用提示的原则。语法:/*+ hint */。使用表另1J名:select/*+ index(e dept_idx)*/ * from emp eO检验提不'常用的提示。rule。all_rows。first_rows。use_nl。use_hashOracle索引博客分类: plsqlOracleSQLOracle索引(转载)一 .B-Tree索引:1.选项择索引字段的原则:l在WHERE句中最频繁使用的字段l联接语句中的联接字段l选择高选择性的字段(如果很少的字段拥有相同值,即有很多独特值,则选择性很好)lORACLE UNIQUES主键字段上自动建立索

34、引l在选择性很差的字段上建索引只有在这个字段的值分布非常倾斜的情况下下才 有益(在这种情况下,某一,两个字段值比其它字值少出现很多)l不要在很少独特值的字段上建 B-TRE缺引,在这种情况下,你可以考虑在这些字 段上建位图索引.在联机事务处理环境下,所由并发性非常高,索引经常被修改, 所以不应该建位图索引l不要在经常被修改的字段上建索引.当有UPDATE,DELETE,INSETT作时,ORACLE 除了要更新表的数据外,同时也要更新索引,而且就象更新数据一样,或产生还原 和重做条目l不要在有用到函数的字段上建索引,ORACL欧这种情况,优化器不会用到索引, 除非你建立函数索引l可以考虑在外键

35、字段上建索引,这些索引允许当在主表上 update,deleTE作时, 不需要共享子表的锁,这非常适用丁在父表和子表上有很多并发的INSERT,UPDATE DELETES作的情况l当建立索引后,请比较一下索引后所获得的查询性能的提高和UPDATE,DELETE,INSERT乍性能上的损失,比较得失后,再最后决定是否需建立 这个索引2.选择建立复合索引复合索引的优点:l改善选择性:复合索引比单个字段的索引更具选择性l减少I/O:如果要查询的字段刚好全部包含在复合索引的字段里,则ORACLE.须 访问索引,无须访问表什么情况下优化器会用到复合索引呢?(a) 当SQL语句的WHERE句中有用到复合

36、索引的领导字段时,ORACL耽化器会 考虑用到复合索引来访问.(b) 当某几个字段在SQL语句的WHERE句中经常通过ANDB作符联合在一些使 用作为过滤谓词,并且这几个字段合在一起时选择性比各自单个字段的选择性要 更好时,可能考虑用这几个字段来建立复合索引.(c) 当有几个查询语句都是查询同样的几个字段值时,则可以考虑在这几个字段 上建立复合索引.复合索引字段排序的原则:l确保在WHERE句中使用到的字段是复合索引的领导字段l如果某个字段在 WHERE句中最频繁使用,则在建立复合索引时,考虑把这个字段排在第一位(在CREATE INDE籍句中) l如果所有的字段在 WHERE句中使用频率相同

37、,则将最具选择性的字段排在最前 面,将最不具选择性的字段排在最后面l如果所有的字段在WHERE句中使用频率相同,如果数据在物理上是按某一个字 段排序的,则考虑将这个字段放在复合索引的第一位二.位图索引 什么情况下位图索引能够改善查询的性能呢 ? lWHERE句包含多个谓词于中低基数的字段l单个的谓词在这些中低基数的字段上选取大量的行l已经有位图索引创建于某些或全部的这些中低基数的字段上l被查询的表包含很多行l可以在单一个表上建立多个位图索引,因此,位图索引能够改善包含冗长 WHERE 子句的复杂查询的性能,在合计查询和星形模型的联接查询语句中,位图索引也 可以提供比较优良的性能位图索引与B-T

38、REE®引的比较l位图索引更节省存储空间l位图索引比较适用于数据仓库环境,但不适于联机事务处理环境.在数据仓库环 境,数据维护通常上通过批量INSER神批量UPDATE完成的,所以索引的维护被 延迟直互DMIB作结束.举例:当你批量插入1000行数据时,这些插入的行被放置 到排序缓存中(SORT BUFFER燃后批处理更新这1000个索引条目,所以,每一个 位图段在每一个DMLB作中只需更新一次,即使在那个位图段里有多行被更新l一个健值的压缩位图是由一个或多个位图段所组成 ,每一个位图段大约相当于半 个BLOCSIZE那么大,锁的最小粒度是一个位图段,在联机事务处理环境,如果多 个事

39、务执行同时的更新(即并发的更新),使用位图索引就会影响 update,insert,deleTE能了l一个B-TREE®引的条目只包含一个 ROWID0此,当一个索引条目被锁定,即一行 被锁定.但是对于位图索引,一个索引条目潜在地有可能包含一段 ROWID某 一个范围内的ROWID行多个ROWID)当一个位图索引条目被锁定时,则这个条目 包含的那一段ROWI耶被锁定,从而影响并发性.当一个位图段内的ROWIDJ数量 越多时,并发性就越差.虽然如此,对于BULKINSERT,UPDATE DELETE图索弓| 的性能还是比B-TREE索引要好三,索引和NULLNULLfi在索引中是被看

40、做一个独特值的除非当一个索引的两行或多行的 NON-NUL值是相等的情况下.在那种情况下,行被看做是相等的,因此,唯一索引不允许行包含空值以怕被看做是相等的.但是,当所有的行都是空值时,这个规则 就不适用.ORACLE不索引所有健值都为NULL勺表的行,除非是位图索引或当簇 键字段值是NULL寸索引I,否则Oracle优化器不能在当WHERE句对某一列使用函数时,除非利用这个简单的技术强制 查询中使用索引。通常情况下,如果在WHER*句中不使用诸如 UPPER REPLACED SUBSTR薛函数,就不能对指定列特定的条件。但如果使用了这些函数,则会出现一个问题:这些函数会阻碍Oracle优化

41、器对列使用索引,因而与采用 索引的情况相比较,查询会花费更多的时间庆幸的是,如果在使用函数的这些列中包含了字符型数据,可以用这样一种方法修改查询语句,以达到强制性使用索引,更有效地运行查询。这篇文章介绍了涉及的技术,并说明了在两种典型情况下怎样实现。大小写混合情况在讨论由于函数修改了列的内容,如何强制使用索引前,让我们首先看看为什么 Oracle优化器在这种情况下不能使用索引。假定我们要搜寻包含了大小写混合的数据,如ADDRESS的NAM削。因为数据是用户输入的,我们无法使用已经统一改为大写的数据。为了找到每一个名为john的地址, 我们使用包含了 UPPERF句的查询语句。如下所示:wher

42、e upper(name)SQL>select address from address like 'JOHN'在运行这个查询语句前,如果我们运行了命令"set autotrace on", 将会得到下列结果,其中包含了执行过程:ADDRESScleveland1 row selected.Execution PlanSELECTSTATEMENTTABLE ACCESS FULL ADDRESS可以看到,在这种情况下,Oracle优化器对ADDRESS!作了一次完整的扫描,而没有使用NAME列的皙引"这是因为|索引是根据列中数据的实际值 建

43、立的,而UPPER®数已经将字符转换成大写, 即修改了这些值,因此该查询不能使用这列的 索弓。优化器不能与索引|项比较"JOHN",没有索引|项对 应于"JOHN"-只有"john"。值得庆幸的是,如果 在这种情况下想要强制使用 索引,有一种简便的方法:只要 在WHERE?句 中增加一个或多个特定的条件,用于测试 索引值,并减少需要扫描的行,但这并没有修改原来 SQL 编码中的条件。以下列查询语句为例:where upper(name)SQL>select address from address like '

44、JO%' AND (namelike 'J%' or name like 'j%');使用这种查询语句(已设置 AUTOTRACE可得到下列结果:ADDRESSCleveland 1 row selected.Execution PlanSELECTSTATEMENTCONCATENATIONTABLE ACCESS BY INDEX ROWID ADDRESSINDEX RANGE SCAN ADDRESSITABLE ACCESS BY INDEX ROWID ADDRESSINDEX RANGE SCAN ADDRESSI第二个语现在,优化器为 WHERf?句中AND联结的两个语句中每一个语句确定的范围进行扫描 句没有引用函数,因而使用了 索引。在两个范围扫描后,将运行结果合并。在这个例子中,如果数据库有成百 忏行,可以用下列方法扩充 WHERE?句,进一步缩小扫描 范围:select address from address whereupper(name) like 'JOHN' AND (name like 'JO%'or name like 'jo%' or name like 'Jo' or name like 'jO&

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论