Oracle开发规范培训.pptVIP

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
Oracle开发规范培训.ppt

索引和SQL写法规范的关系 使用IS NULL 或IS NOT NULL的限制 NULL值并非不被定义,在SQL语句中使用NULL会有很多的麻烦。因此建议开发人员在建表时,把需要索引的列设成 NOT NULL。如果被索引的列在某些行中存在NULL值,就不会使用这个索引 对于单列索引,如果列包含空值,索引中将不存在此记录. 对于复合索引,如果每个列都为空,索引中同样不存在此记录,如果至少有一个列不为空,则记录存在于索引中. 索引和SQL写法规范的关系 举例说明 如果唯一性索引建立在表的A列和B列上, 并且表中存在一条记录的A,B值为(123,null) , ORACLE将不接受下一条具有相同A,B值(123,null)的记录(插入),然而如果所有的索引列都为空,ORACLE将认为整个键值为空而空不等于空;因此你可以插入1000 条具有相同键值的记录,当然它们都是空,因为空值不存在于索引列中,所以WHERE子句中对索引列进行空值比较将使ORACLE停用该索引,因此,请开发人员注意,唯一索引(主键索引)请不要建立在有NULL值的列上 SQL举例 索引失效 SELECT * FROM ?TABLE ?WHERE ?COLUMN IS NOT NULL; SELECT * FROM ?TABLE ?WHERE ?COLUMN IS NULL; 索引和SQL写法规范的关系 使用函数的限制 如果不使用基于函数的索引,那么在SQL语句的WHERE子句中对存在索引的列使用函数时,会使优化器忽略掉这些索引,理由很简单,在索引中存储的并不是函数得出的数据 ,这个问题也是开发人员在编写SQL时经常会犯的错误,请注意 SQL举例 索引失效 Select * from table where trunc(column2)=01-MAY-81; 索引有效 Select * from table where column2=to_date(01-MAY-81); 索引和SQL写法规范的关系 没有使用索引第一列的限制 如果索引是建立在多个列上, 只有在它的第一个列(leading column)被where子句引用时,优化器才会选择使用该索引. 这也是一条简单而重要的规则,当仅引用索引的第二个列时,优化器使用了全表扫描而忽略了索引 SQL举例 创建表 SQL create table t 2 (object_name VARCHAR2(25) not null, 3 object_id number(20) not null, 4 object_code VARCHAR2(20) not null 5 ); Table created. 创建索引 create index t_id on t(object_id,object_code); 索引和SQL写法规范的关系 索引有效 select * from t where object_id=123; select * from t where object_id=123 and object_code=abc; select * from t where object_code=abc and object_id=123; 索引无效 select * from t where object_code=abc; 顺便在这里和开发的同事说明下:如果建立了多个列的复合索引,那该索引的前导列的单一索引不用再建,否则是重复 比如上面这个例子: create index t_id on t(object_id,object_code); 那OBJECT_ID的单一索引不要建了,否则重复反而影响性能 索引和SQL写法规范的关系 不匹配的数据类型的限制 举例说明: column1是一个VARCHAR2类型,在column1字段上有索引,下面的语句将执行全表扫描: select column1,column2 from table where column1 = 990354; Oracle可以自动把where子句变成to_number(column1)=990354,这样就限制了索引的使用,改成下面的查询就可以使用索引: select column1,column2 from table where column1 =990354; 特别注意:现在的SQL基本都是用的绑定变量,但是绑定变量的类型不对,导致上述问题,这个问题请开发同事重视 索引和SQL写法规范的关系 编写SQL的WHERE条件尽量使用高选择性的索引 这个是比较重要的,根据应用实际情况尽量使用高选择性的索引 索引扫描的几种类型 索引唯一扫描(index unique scan) 索

文档评论(0)

zhiminwei + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档