全扫描访问方法:(1)如何选择全扫描操作

一般来说,总共只有两种基本的数据访问途径:全扫描或者索引扫描。全扫描过程中,多个块被读入到一个IO运算中。索引扫描首先扫描索引叶子块以取得特定的行ID,然后利用这些行ID来访问父表取得实际的数据。

全扫描访问方法:当对一个对象进行扫描时,与改对象相关的所有数据块都必须取出并进行处理,以确定块中所包含的数据行是否是你的查询所需要的,Oracle必须将整个数据块读取到内存中以取得这个块中所存储的数据行的数据。当一个查询需要返回表中绝大多数的数据行时,选择使用全扫描的可能性当然也是最高的。

如何进行全扫描工作:

如果对于一个查询返回少数的数据行时,也会选择全表扫描。

创建两个测试表:

Eg:

create table t1 as
select trunc((rownum-1)/100) id,
rpad(rownum,100) t_pad
from dba_source
where rownum <= 10000;

create index t1_idx1 on t1(id);

exec dbms_stats.gather_table_stats(user,‘t1‘,method_opt=>‘FOR ALL COLUMNS SIZE 1‘,cascade=>TRUE);

create table t2 as
select mod(rownum,100) id,
rpad(rownum,100) t_pad
from dba_source
where rownum <= 10000;

create index t2_idx1 on t2(id);

exec dbms_stats.gather_table_stats(user,‘t2‘,method_opt=>‘FOR ALL COLUMNS SIZE 1‘,cascade=>TRUE);

对于t1,t2都有10000行数据,两个表中的id列对于0-99的每个值都有100行,因此,从数据内容的角度来说,这2张表示一样的。但是对于t1,id列是通过trunc((rownum-1)/100)来计算的。而t2id列是通过MOD(rownum,100)计算。下图展示了数据块的存储情况。

运行聚合函数:

select count(*) ct from t1 where id = 1 ;

select count(*) ct from t2 where id = 1 ;

假设我们要找 id = 1 的值, 我们知道是100行, 而全表有10000行, 选择比是 100/10000 = 1%, 我们知道, 这个选择比很小, 优化器应该使用索引来得到数据, 因为我们已经在id列创建了索引, 但是此时, 我们应该了解一下数据是如何存储的, 如果数据时顺序存储的, 大多数的 id=1的行在物理上仅存储于几个数据块中, 如本例中t1那样, 那么这个结论是对的.(使用索引)

为什么优化器没有为这两个查询选择同样的解释计划呢 ? 这是因为在这两张表中数据的存储方式不同, 对于表 t1 的查询 oracle 仅需要访问很少的几个数据块来取得查询所需的 100行数据, 因此, 索引就是最具吸引力的选择, 但是, 由于表 t2 的数据行在物理上零散存储在该表的所有数据块中, 对于它的查询就需要读取几乎所有数据块来获取同样的 100 行数据. 优化器计算出使用索引来读取表中的每一个数据块的时间可能比直接使用全表扫描读取所有数据块要长.

全扫描访问方法:(1)如何选择全扫描操作

时间: 2024-11-16 00:19:14

全扫描访问方法:(1)如何选择全扫描操作的相关文章

全扫描访问方法:(2)全扫描与舍弃

全扫描是否为高效的选择取决于需要访问的数据块个数以及最终的结果集行数. 此外,全扫描是否高效的另一个关键因素是舍弃.所访问数据块数目以及舍弃的数量越大,全表扫描的成本也就越高. 对全扫描访问方法(1)中的T2 j进行全扫描所需要的数据块数如下所示: SELECT t.table_name, t.num_rows, t.blocks FROM user_tables t WHERE t.table_name = 'T2' 结果为: T2 10000 152 全扫描访问方法:(2)全扫描与舍弃,布布

动态设置全屏、取消全屏的方法,以及切换全屏保持内容位置不变的方法

http://blog.csdn.net/lovehong0306 有两种形式设置.取消全屏的方法,之所以称作两种形式而不是两种方法,是因为这两种方式只是写法不同,实质是一样的. 形式一: //设置全屏 getWindow().addFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN); //取消全屏 getWindow().clearFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN); 形式二: //

索引访问方法及索引优化

要了解索引访问方法,首先要知道索引的结构. 1.表和索引的结构  页 页是sql server存储数据的基本单位,大小为8kb,可以存储表数据.索引数据.执行计划数据.分配位图.可用空间信息.页是sql server可以读写的最小I/O单位.即便是读取一行数据,它也要把整个页加载到缓存并从缓存中读取数据. 区 区是由8个连续页组成的分配单元. 堆 堆是指不含聚集索引的表,它的数据不按任何顺序进行存储. 联系一个堆中的数据的唯一结构是被称为索引分配映射(IAM)的一个位图页,当扫描对象时,SQl

Oracle性能分析4:数据访问方法之全扫描

SQL语句执行时,Oracle的优化器会根据统计信息确定表的访问方式,一般来说,有两种基本的数据访问方式:1)全扫描.在全扫描(全表扫描或者快速全索引扫描)中,多个块被读入到一个IO运算中.2)索引扫描.索引扫描首先扫描索引叶子块以取得特定的行id(rowid),然后利用这些行id来访问父表取得实际的行数据,访问通过单块读取来完成.这里主要讲解全扫描方式,后面将介绍索引扫描. 使用全扫描 当对一个表进行全扫描时,会将表中所有数据块(block)取出并进行处理,筛选出符合条件的数据.注意Oracl

jQuery实现复选框全选/全部取消/反选/获得选择的值

本地单文件上传脚本,命名uf 这是在本机上做的测试,利用bpcs_uploader脚本实现,只是进行简单的封装,自动完善云端文件路径. 技术要点:使用dirname获取文件所在目录,使用pwd获取文件完整路径,并作为云端文件路径. #!/bin/bash cur_dir=$(cd "$(dirname "$1")"; pwd) name=$(basename "$1") /home/grm/bin/bpcs_uploader/bpcs_uploa

Android应用程序全屏显示方法

导入两个包: import android.view.Window; import android.view.WindowManager; public class MainActivity extends ActionBarActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); this.requestWindowFeature(W

JS 控制checkbox 获取 全选 全不选 一行不选择全选则不被选择 全部选择全选被选择

</pre><pre name="code" class="javascript"><span style="font-size:18px;">//点击全选按钮的事件操作 function selectAll(){ var allcheckBoxs=document.getElementsByName("iTo"); var select=document.getElementsByName

JS如何实现对name是数组的复选框的全选和反选以及取消选择

JS如何实现对name是数组的复选框的全选和反选以及取消选择? form内容如下: 因为PHP接收要用 数组形式的 复选框,正常情况下 JQ可如果是这种 直接使用 $("input[name=ptpt])即可.但是这种php接收的只是最后一个值,字符串.<label><input type='checkbox' name='ptpt' value='a1' />a1</label><label><input type='checkbox' n

asp.net 客户端上传文件全路径获取方法

asp.net  获取客户端上传文件全路径方法: eg:F:\test\1.doc 基于浏览器安全问题,浏览器将屏蔽获取客户端文件全路径的方法,只能获取到文件的文件名,如果需要获取全路径则需要另想其他方法 如下提供两种方法: 方法1:工具 -> Internet选项 -> 安全 -> 自定义级别 -> 找到“其他”中的“将本地文件上载至服务器时包含本地目录路径”,选中“启用”即可. 方法2: function getPath() { //获取file 控件对象 var obj =