`
bianxq
  • 浏览: 91610 次
  • 性别: Icon_minigender_1
  • 来自: 福州
社区版块
存档分类
最新评论

Oracle的大表,小表与全表扫描

阅读更多

通常对于小表,Oracle建议通过全表扫描进行数据访问,对于大表则应该通过索引以加快数据查询,当然如果查询要求返回表中大部分或者全部数据,那么全表扫描可能仍然是最好的选择。
从V$SYSSTAT视图中,我们可以查询得到关于全表扫描的系统统计信息:

SQL> col name for a30
SQL> select name,value from v$sysstat
2 where name in ('table scans (short tables)','table scans (long tables)');

NAME VALUE
------------------------------ ----------
table scans (short tables) 828
table scans (long tables) 101

其中table scans (short tables)指对于小表的全表扫描的此时;table scans (long tables)指对于大表的全表扫描的次数。
从Statspack的报告中,我们也可以找到这部分信息:

Instance Activity Stats for DB: CELLSTAR Instance: ora8i Snaps: 20 -

Statistic Total per Second per Trans
--------------------------------- ---------------- ------------ ------------
。。。。。。
table scan blocks gotten 38,228,349 37.0 26.9
table scan rows gotten 546,452,583 528.9 383.8
table scans (direct read) 5,784 0.0 0.0
table scans (long tables) 5,990 0.0 0.0
table scans (rowid ranges) 5,850 0.0 0.0
table scans (short tables) 1,185,275 1.2 0.8

通常,如果一个数据库的table scans (long tables)过多,那么db file scattered read等待事件可能同样非常显著,和以上数据来自同一个report的Top5等待事件就是如此:

Top 5 Wait Events
~~~~~~~~~~~~~~~~~ Wait % Total
Event Waits Time (cs) Wt Time
-------------------------------------------- ------------ ------------ -------
log file parallel write 1,436,993 1,102,188 10.80
log buffer space 16,698 873,203 8.56
log file sync 1,413,374 654,587 6.42
control file parallel write 329,777 510,078 5.00
db file scattered read 425,578 132,537 1.30

数据库内部,很多信息和现象都是紧密相关的,只要我们加深对于数据库的了解,在优化和诊断数据库问题时就能够得心应手。

Oracle通过一个内部参数_small_table_threshold来定义大表和小表的界限。缺省的该参数等于2%的Buffer数量,如果表的大小小于该参数定义,Oracle认为该表为小表,否则Oracle认为该表为大表。
我们看一下Oracle9iR2中的情况:

SQL> @@GetParDescrb.sql
Enter value for par: small
old 6: AND x.ksppinm LIKE '%&par%'
new 6: AND x.ksppinm LIKE '%small%'

NAME VALUE DESCRIB
------------------------------ -------------------- ------------------------------------------------------------
_small_table_threshold 200 threshold level of table size for direct reads

以上数据库中,200正好约为Buffer数量的2%:

SQL> show parameter db_cache_size

NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
db_cache_size big integer 83886080

 

SQL>show sga


SQL> select (83886080/8192)*2/100 from dual;

(83886080/8192)*2/100
---------------------
204.8

 

================================================================

SQL>select owner, segment_name, bytes/1024/1024 size_Mb 
from dba_segments
where segment_type='TABLE' and segment_name='TEST';

 

 

所以要区分大小表(Long/Short)是因为全表扫描可能引起Buffer Cache的抖动,缺省的大表的全表扫描会被置于LRU的末端,以期尽快老化,减少Buffer的占用。从Oracle8i开始,Oracle的多缓冲池管理技术(Default/Keep/Recycle池)给了我们另外一个选择,对于不同大小、不同使用频率的数据表,从建表之初就可以指定其存储Buffer,以使得内存使用更加有效。

分享到:
评论

相关推荐

    oracle全表扫描的3种优化手段

    oracle全表扫描的3种优化手段及详细命令

    Oracle全表扫描及其执行计划

     全表扫描是扫表表中所有的行,实际上是扫描表中所有的数据块,因为Oracle中小的存储单位是Oracle block。  扫描所有的数据块包括高水位线以内的数据块,即使是空数据块在没有被释放的情形下也会被扫

    Oracle 表的扫描方式及连接方法

    Oracle 表的扫描方式及连接方法,全表扫描,索引扫描,索引范围扫描,索引唯一扫描

    个人整理,oracle访问路径(全表扫描、回表、索引范围扫描等等)

    个人整理,oracle访问路径(全表扫描、回表、索引范围扫描等等)

    SQL中WHERE变量IS NULL条件导致全表扫描问题的解决方法

    印象中记得,以前在做Oracle开发时,这种写法是会导致全表扫描的,用不上索引,不知道Sql Server里是否也是一样呢,于是做一个简单的测试1、建立测试用的表结构和索引: 代码如下:CREATE TABLE aaa(id int IDENTITY,...

    oracle优化笔记

    计划,发现 SQL2 的执行计划也是全表扫描,这里 t1.name=的取值为 cc 的返回仅仅 10 条 记录,而 T1 表记录都在 5 千万左右, T2 表在 200 万左右,需要全扫这么大的两个表而获 取仅有的 10 记录吗? 这里又要再次...

    oracle动态性能表

     table scans (blocks gotten):全表扫描中读取的总块数,不包括那些split的列。  user commits + user rollbacks:系统事务起用次数。当需要计算其它统计中每项事务比率时该项可以被做为除数。例如,计算事务中...

    oracle的sql优化

     对Oracle共享池和缓冲区中的Sql必须要大小写都完全用上才能够匹配上 2.顺序问题  Oracle按照从右到左的顺序对数据表进行解析。因此From最后面的表为基础表,一般要选择记录数最少的表作为基础表。  对于Where...

    oracle 数据库优化技术资料

    在缺省情况下,ORACLE采用CHOOSE优化器, 为了避免那些不必要的全表扫描(full table scan) , 你必须尽量避免使用CHOOSE优化器,而直接采用基于规则或者基于成本的优化器. 2. 访问Table的方式 ORACLE 采用两种...

    oracle性能优化技巧

    ORACLE的优化器共有3种 ... 在缺省情况下,ORACLE采用CHOOSE优化器, 为了避免那些不必要的全表扫描(full table scan) , 你必须尽量避免使用CHOOSE优化器,而直接采用基于规则或者基于成本的优化器

    Oracle数据库学习指南

    26.你的SQL语句在什么情况下使用全表扫描? 27.如何对CLOB行字段执行全文检索 28.如何让你的SQL运行得更快 29.如何使‘CREATE TABLE AS SELECT’能支持ORDER BY 30.删除表内重复记录的方法 31.数据库安全...

    ORACLE9i_优化设计与系统调整

    §13.1.6 避免全表扫描 163 §13.1.7 编写避免使用索引的语句 163 §13.1.8 编写使用索引的语句 164 §13.1.9 重新构造索引 164 §13.1.10 压缩索引 165 §13.2 创建索引和使用索引 165 §13.2.1 使用函数索引 165 ...

    解析Oracle数据扫描Oracle SQL查询优化

    之前我们讨论了在数据库中数据读取操作的类型,重点讨论了对数据读取操作大为有益的局部范围扫描的数据读取方式,同时还探讨了数据库优化器模式对于启用局部范围扫描的影响,以及启用局部范围扫描的前提下优化器设置...

    Oracle优化53解

    在缺省情况下,ORACLE采用CHOOSE优化器,为了避免那些不必要的全表扫描(full table scan) , 你必须尽量避免使用CHOOSE优化器,而直接采用基于规则或者基于成本的优化器。 2. 访问Table的方式ORACLE 采用两种...

    深入解析Oracle.DBA入门进阶与诊断案例

    10.3.6 创建新的索引以消除全表扫描 494 10.3.7 观察系统状况 494 10.3.8 性能何以提高 495 10.3.9 小结 497 10.4 使用SQL_TRACE/10046事件进行数据库诊断 497 10.4.1 SQL_TRACE及10046事件的基础介绍 ...

    Oracle SQL建立有效索引减少回表

    回表:在数据中,当查询数据的时候,在索引中查找索引后,获得该行的rowid,根据rowid再查询表中数据,是回表。...  如果在b上没有建立索引,那么该条SQL语句执行时,要进行全表扫描,扫描所有该表中的数据块

    oracle_sql性能优化

    在缺省情况下,ORACLE采用CHOOSE优化器, 为了避免那些不必要的全表扫描(full table scan) , 你必须尽量避免使用CHOOSE优化器,而直接采用基于规则或者基于成本的优化器. 2. 访问Table的方式 ORACLE 采用两种访问表...

    oracle管理及优化文档 粗略整理

    对它的处理只会产生全表扫描,改为 a> XX or a 4.在设计表的时,把索引列设置为not null 5。尽量不用通配符 %或者_ 作为查询字符串的第一个字符。当他们作为第一 个字符时,索引不会使用, 6,where 子句中...

Global site tag (gtag.js) - Google Analytics