关于COUNT STOPKEY的工作机制

   在查询中有时使用到伪列rownum对使用伪列rownum的查询,优化器要么使用count操作,要么使用count stopkey操作来对rownum计数器进行增量(注意:这里的count操作和count stopkey操作与count函数没有任何关系),如果对rownum伪列应用一个限定条件,如:where rownum<10;则使用 count stopkey操作,如果不为Rownum伪列指定限定条件,则是使用count操作。


例1:不在Rownum伪列上使用限定条件


 select id,rownum from employee;(在id列上有一个主键索引)为了完成这个查询,优化器执行一个全索引扫描(主键索引),后跟一个count操作生成每个行的rownum值,
count操作不需要等待得到整个记录集,随着从employee表中返回记录,rownum计数器进行增量,从而确定每个记录的rownum.


例2:在rownum伪列上使用一个限定


 select id,rownum from employee where rownum<10;
     为了实施限定条件,优化器用count stopkey操作代替count操作,它将rownum伪列的增量值与限定条件中指定的值进行比较,如果rownum伪列的值大于限定条件中指定的值,则查询不再返回更多的行!
 
 注意:在where 子句中不能使用 rownum>10这样的操作,只能使用rownum<10这样的操作!
 
 
 
 SQL> select rownum rn ,a.* from cnmir.ew_auctions a where rownum<50000;


Execution Plan
----------------------------------------------------------
Plan hash value: 721966694


----------------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
----------------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 49999 | 4833K| 163 (2)| 00:00:02 |
|* 1 | COUNT STOPKEY | | | | | |
| 2 | TABLE ACCESS FULL| EW_AUCTIONS | 49999 | 4833K| 163 (2)| 00:00:02 |
----------------------------------------------------------------------------------


SQL> select * from cnmir.ew_auctions where issue_id<80;


Execution Plan
----------------------------------------------------------
Plan hash value: 518049957


---------------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
---------------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 1 | 99 | 1379 (2)| 00:00:17 |
|* 1 | TABLE ACCESS FULL| EW_AUCTIONS | 1 | 99 | 1379 (2)| 00:00:17 |
---------------------------------------------------------------------------------


可见COUNT STOPKEY 机制是只针对rownum而设定的!
 
  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
《海量数据库解决方案》将整体内容分为两部分: 第1部分中以影响数据读取效率的所有要素为类别,对其各自的概念、原理、 特征、应用准则,以及表的结构特征、多样化的索引类型、优化器的内部作用、优化器为各种结果制定的执行计划予以详细说明,并以对优化器的正确理解为基础,提出对执行计划和执行速度产生最大影响的索引构建战略方案; 第2部分中主要介绍提高数据读取效率的具体战略方案,在这部分中介绍与数据读取效率相关的局部范围扫描的原理和具体应用方法,以及对被认为是提高数据库使用效率基础的表连接的所有类型予以详细说明。   《海量数据库解决方案》系列丛书深受广大读者的喜爱已经长达10年之久,在被誉为“圣经”的同时,它已经变成了数据库用户不可或缺的必读书籍。作者竭力探求能够让it工作者在实际工作中轻松应用并掌控的巧妙方法,提供事半功倍的海量数据库解决之道。   《海量数据库解决方案》适合数据库开发人员和数据库管理员等阅读。 目录: 第1部分 影响数据读取的因素 第1章 数据的存储结构和特征1 1.1 表和索引分离型5 1.1.1 堆表的结构5 1.1.2 聚簇因子(cluster factor)10 1.1.3 影响读取的因素13 1.1.3.1 大范围数据读取的处理方案14 1.1.3.2 提高聚簇因子的手段17 1.2 索引组织表(index-organized table)19 1.2.1 堆表和索引组织表的比较19 1.2.2 索引组织表的结构和特征20 1.2.3 逻辑rowid和物理猜(physical guess)22 1.2.4 溢出区(overflow area)24 1.2.5 索引组织表的创建25 1.3 聚簇表26 1.3.1 聚簇表的概念27 1.3.2 单表聚簇29 1.3.3 复合表聚簇31 1.3.4 聚簇表的代价34 1.3.5 哈希聚簇39 .第2章 索引的类型和特征43 2.1 b-tree 索引44 2.1.1 b-tree 索引的结构44 2.1.2 b-tree 索引的应用47 2.1.3 反向键索引52 2.2 位图索引53 2.2.1 位图索引的形成背景54 2.2.2 位图索引的结构和特征55 2.2.3 位图索引的读取57 2.3 基于自定义的函数索引60 2.3.1 基于自定义的函数索引的概念和结构60 2.3.2 基于自定义函数索引的约束61 2.3.3 基于自定义函数索引的灵活运用64 第3章 sql的执行计划(explain plan)74 3.1 sql和优化器75 3.1.1 优化器的作用和人的作用77 3.1.2 优化器的类型80 3.1.2.1 基于规则的优化器82 3.1.2.2 基于成本的优化器86 3.1.2.3 优化器目标的选择93 3.1.2.4 执行计划的固定化方案97 3.1.2.5 优化器的局限103 3.1.3 优化器的最优化步骤106 3.1.4 查询语句的转换112 3.1.4.1 传递性规则113 3.1.4.2 视图合并(view merging)116 3.1.4.3 查看用户定义的绑定变量122 3.1.5 开发者的作用123 3.2 执行计划的类型126 3.2.1 扫描的基本类型126 3.2.1.1 全表扫描127 3.2.1.2 rowid扫描132 3.2.1.3 索引扫描133 3.2.1.4 b-tree聚簇读取(cluster access)138 3.2.1.5 哈希聚簇读取(hash cluster access)139 3.2.1.6 采样表扫描(sample table scan)140 3.2.2 表连接的执行计划143 3.2.2.1 嵌套循环连接(nested loops join)143 3.2.2.2 排序合并连接(sort merge join)146 3.2.2.3 哈希连接(hash join)148 3.2.2.4 半连接(semi join)149 3.2.2.5 笛卡儿连接151 3.2.2.6 外连接(outer join)154 3.2.2.7 索引连接159 3.2.3 其他运算方式的执行计划161 3.2.3.1 in-list迭代执行计划162 3.2.3.2 连锁执行计划163 3.2.3.3 远程执行计划165 3.2.3.4 排序操作执行计划168 3.2.3.5 集合操作执行计划171 3.2.3.6 count(stopkey)执行计划174 3.2.4 位图(bitmap)执行计划175 3.2.4.1 各种条件运算符的位图执行计划176 3.2.4.2 子查询执行计划182 3.2.4.3 与b-tree索引相结合的执行计划184 3.2.5 其他特殊处理的执行计划185 3.2.5.1 递归展开(recursive implosion)执行计划186 3.2.5.2 修改子查询执行计划191 3.2.5.3 特殊类型的执行计划193 3.3 执行计划的控制203 3.3.1 提示的活用准则204 3.3.2 使用提示实现最优化目标206 3.3.3 使用提示改变表连接顺序207 3.3.4 表连接方式选择过程中提示的使用208 3.3.5 并行操作中提示的使用209 3.3.6 数据读取方法选择中提示的使用211 3.3.7 查询转换(query transformation)过程中提示的使用214 3.3.8 其他提示216 第4章 构建索引的战略方案221 4.1 索引的选定准则222 4.1.1 不同类型表的索引应用准则223 4.1.2 离散度和损益分界点227 4.1.3 索引合并和组合索引的比较229 4.1.4 组合索引的特征232 4.1.5 组合索引中列序的决定准则239 4.1.6 索引选定步骤242 4.2 决定聚簇类型的准则263 4.2.1 全局性聚簇263 4.2.2 局部性聚簇265 4.2.3 单表聚簇266 4.2.4 单位聚簇大小的决定267 4.2.5 确保聚簇被使用的措施270 第2部分 最优化数据读取方案 第5章 局部范围扫描(partial range scan)274 5.1 局部范围扫描的概念276 5.2 局部范围扫描的应用原则281 5.2.1 局部范围扫描的条件281 5.2.2 不同优化器模式下的局部范围扫描284 5.3 提高局部范围扫描执行速度的原理285 5.4 向局部范围扫描引导的方法289 5.4.1 利用访问路径实现对sort的代替289 5.4.2 只使用索引的局部范围扫描292 5.4.3 min、max 的处理293 5.4.4 filter型局部范围扫描298 5.4.5 rownum的灵活运用300 5.4.6 利用嵌套视图的局部范围扫描306 5.4.7 利用函数的局部范围扫描308 5.4.8 利用查询语句二元化特性的局部范围扫描316 5.4.9 web留言板中的局部范围扫描318 第6章 表连接的最优化方案336 6.1 join和loop query的比较339 6.1.1 全部范围扫描方式下的比较341 6.1.2 局部范围扫描方式下的比较349 6.2 连接条件状态对表连接的影响351 6.2.1 连接条件正常353 6.2.2 连接条件一边异常358 6.2.3 连接条件两边异常361 6.3 各种表连接方式的特征及活用方案365 6.3.1 嵌套循环连接366 6.3.1.1 嵌套循环连接的基本概念367 6.3.1.2 嵌套循环连接顺序的决定370 6.3.2 排序合并连接379 6.3.3 嵌套循环连接和排序合并连接的比较383 6.3.4 哈希连接(hash join)387 6.3.4.1 in-memory哈希连接392 6.3.4.2 延迟哈希连接395 6.3.5 半连接(semi join)398 6.3.5.1 半连接的概念和特征399 6.3.5.2 半连接的执行计划401 6.3.6 星型(star)连接417 6.3.7 星变形(star transformation)连接425 6.3.8 位图连接索引436

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值