oracle的的查访,Oracle 查询优化器 -- 访问路径

-- Start

全表扫描(full table scans)

不要以为全表扫描就一定慢, 全表扫描时, 由于数据块在磁盘中是连续的,Oracle 可以一次读取多个块来提高查询效率,至于多少个块,是由 DB_FILE_MULTIBLOCK_READ_COUNT 决定的。所以,如果你需要返回一个表的大部分数据,全表扫描要比索引扫描快。除此之外,Oracle 会自动对小表进行全表扫描,那什么是小表呢?就是语句块小于 DB_FILE_MULTIBLOCK_READ_COUNT 定义的值。

如果你想让 Oracle 使用全表扫描,你也可以通过下面的方式指示 Oracle 使用全表扫描。

select /* FULL(t)*/ * from test t where col = 'test';

索引扫描(index scans) 你有没有想过,我们通过索引扫描时,如何通过索引定位到表中的位置呢?答案是通过 Rowid, Rowid 是 Oracle 内部使用的,用来标示行存储地址,所以通过 Rowid 定位行记录是最快的。有一点特别需要注意,Oracle 读写磁盘的最小单位是块,一个块可能包含多行,所以全表扫描还是索引扫描取决于访问块的百分比,而不是行的百分比。假设我们现在需要访问 3 行,这 3 行可能在一个块中,也可能在两个块中,还可能在三个块中,很明显,最理想的情况是在一个块中,Oracle 使用索引聚簇因子(index clustering factor)来衡量这种特性。索引聚簇因子越高,表明 Oracle 通过 Rowid 访问行的代价就越高。此外,Oracle 会根据索引类型的不同,是否排序,采用不同的索引扫描方式。

唯一索引扫描(Index Unique Scans)

如果你的查询条件有等价操作符(=),且恰好能用到唯一索引,那么 Oracle 会采用唯一索引扫描,当然你也可以通过下面的方式建议 Oracle 采用哪个索引。

select /* INDEX(t test_id_pk)*/ * from test t where col = 'test';

索引范围扫描(Index Range Scans) 如果你的查询条件有范围操作符(>,>=,

select /* INDEX(t test_id_pk)*/ * from test t where col = 'test';

索引降序范围扫描(Index Range Scans Descending) 如果你的查询条件有范围操作符且要求用索引列排序,那么 Oracle 会采用索引降序范围扫描,这样做的好处是 Oracle 可以省略排序这个非常耗时的步骤。当然你也可以通过下面的方式建议 Oracle 采用索引降序范围扫描。

如果你的索引是升序的。

select /* INDEX_DESC(t test_id_pk)*/ * from test t where col = 'test';

如果你的索引是降序的。

select /* INDEX_ASC(t test_id_pk)*/ * from test t where col = 'test';

索引跳跃扫描(Index Skip Scans) 如果你的索引是复合索引,也就是索引包含多个列,如下所示。

CREATE INDEX cust_idx ON customers (gender, email);

而你的查询语句没有用到索引的第一列 gender,只用到了第二列 email, 如下所示。

SELECT * FROM customers WHERE email = 'wave0409@163.com';

由于性别列(gender)只有男女两个值,Oracle 会采用如下的方式做查询。

SELECT * FROM customers WHERE gender='M' AND email = 'wave0409@163.com';

UNION ALL

SELECT * FROM customers WHERE gender='F' AND email = 'wave0409@163.com';

Oracle 把这种查询方式叫做索引跳跃扫描,需要注意的是这种方式只适合像性别这样,值非常少的列,你也可以通过下面的方式建议 Oracle 采用索引跳跃扫描。

select /* INDEX_SS(t test_id_idx)*/ * from test t where col = 'test';

select /* INDEX_SS_ASC(t test_id_idx)*/ * from test t where col = 'test';

select /* INDEX_SS_DESC(t test_id_idx)*/ * from test t where col = 'test';

全索引扫描(Full Scans) 如果你的查询需要排序或分组,且排序或分组用到的列恰好是索引列,那么 Oracle 会采用全索引扫描,由于索引列是有序的,这样 Oracle 可以省略排序这个非常耗时的步骤。

快速全索引扫描(Fast Full Index Scans) 如果你要查询的所有列都包含在索引中,Oracle 就不需要访问表了,这样 Oracle 就可能通过并行和一次读取多个块来提高查询索引的效率。你也可以通过下面的方式建议 Oracle 采用快速全索引扫描。

select /* INDEX_FFS(t test_id_pk)*/ * from test t where col = 'test';

索引连接扫描(Index Joins) 如果你的表有多个索引,恰好你要查询的所有列包含在这些索引中,Oracle 就不需要访问表了,Oracle 只需要把这些索引连接起来。你也可以通过下面的方式建议 Oracle 采用索引连接。

select /* INDEX_JOIN(t test_id_idx test_name_idx)*/ * from test t where col = 'test';

位图索引扫描(Bitmap Indexes) 如果你的表定义了位图索引,Oracle 会使用位图索引来做查询,你也可以通过下面的方式建议 Oracle 采用位图索引扫描。

select /* INDEX_COMBINE(t test_idx1 test_idx2)*/ * from test t where col = 'test';

索引聚簇扫描(Indexed Cluster Access) 如果你的表包含在了某个索引聚簇中,Oracle 会使用索引聚簇来执行查询。

Hash 聚簇扫描(Hash Cluster Access) 如果你的表包含在了某个Hash 聚簇中,Oracle 会使用 Hash 聚簇来执行查询。

采样扫描(Sample Table Scans) 如果你的查询语句包含 SAMPLE 子句,那么 Oracle 会使用 采样扫描。

-- 声明:转载请注明出处

-- Last edited on 2015-08-28

-- Created by ShangBo on 2015-07-17

-- End

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
对于计算机专业的学生而言,参加各类比赛能够带来多方面的益处,具体包括但不限于以下几点: 技能提升: 参与比赛促使学生深入学习和掌握计算机领域的专业知识与技能,如编程语言、算法设计、软件工程、网络安全等。 比赛通常涉及实际问题的解决,有助于将理论知识应用于实践中,增强问题解决能力。 实践经验: 大多数比赛都要求参赛者设计并实现解决方案,这提供了宝贵的动手操作机会,有助于积累项目经验。 实践经验对于计算机专业的学生尤为重要,因为雇主往往更青睐有实际项目背景的候选人。 团队合作: 许多比赛鼓励团队协作,这有助于培养学生的团队精神、沟通技巧和领导能力。 团队合作还能促进学生之间的知识共享和思维碰撞,有助于形成更全面的解决方案。 职业发展: 获奖经历可以显著增强简历的吸引力,为求职或继续深造提供有力支持。 某些比赛可能直接与企业合作,提供实习、工作机会或奖学金,为学生的职业生涯打开更多门路。 网络拓展: 比赛是结识同行业人才的好机会,可以帮助学生建立行业联系,这对于未来的职业发展非常重要。 奖金与荣誉: 许多比赛提供奖金或奖品,这不仅能给予学生经济上的奖励,还能增强其成就感和自信心。 荣誉证书或奖状可以证明学生的成就,对个人品牌建设有积极作用。 创新与研究: 参加比赛可以激发学生的创新思维,推动科研项目的开展,有时甚至能促成学术论文的发表。 个人成长: 在准备和参加比赛的过程中,学生将面临压力与挑战,这有助于培养良好的心理素质和抗压能力。 自我挑战和克服困难的经历对个人成长有着深远的影响。 综上所述,参加计算机领域的比赛对于学生来说是一个全面发展的平台,不仅可以提升专业技能,还能增强团队协作、沟通、解决问题的能力,并为未来的职业生涯奠定坚实的基础。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值