网管联盟 | 网管论坛 | 网管u家 | 网管博客 | 网管软件 | 网管求职 | 小游戏 | 网管搜索 | 网管原创 | 网管聚合 | 网管读摘 | 网管焦点 | 世界素材 | 会员投稿 | 会员中心 
中国网管联盟
Windows Linux Cisco 网络技术 数据库 黑客攻防 DotNet Java PHP 认证 新闻资讯 服务器 存储资讯 网络设备 网管学堂 技术专题 焦点 网吧频道
 当前位置: > bitsCN.com > 数据库技术 > Oracle > 体系架构 > Oracle数据库的大表,小表与全表扫描  

Oracle数据库的大表,小表与全表扫描

2006-09-07  作者:网管整理  来源:bitsCN.com  点评 投稿 收藏

  通常对于小表,Oracle建议通过全表扫描进行数据访问,对于大表则应该通过索引以加快数据查询,当然如果查询要求返回表中大部分或者全部数据,那么全表扫描可能仍然是最好的选择。

网管网www.bitscn.com

  从V$SYSSTAT视图中,我们可以查询得到关于全表扫描的系统统计信息: 

网管网www.bitscn.com


SQL> col name for a30
SQL> select name,value from v$sysstat
  2  where name in ('table scans (short tables)','table scans (long tables)'); 网管u家u.bitsCN.com

NAME                                  VALUE
------------------------------     ----------
table scans (short tables)            828
table scans (long tables)             101 网管联盟bitsCN_com

  其中table scans (short tables)指对于小表的全表扫描的此时;table scans (long tables)指对于大表的全表扫描的次数。

网管u家bitscn.net

  从Statspack的报告中,我们也可以找到这部分信息: 网管u家u.bitsCN.com

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 

网管有家bitscn.net


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等待事件就是如此: 网管论坛bbs_bitsCN_com

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 网管网www_bitscn_com
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

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

网管有家www.bitscn.net

  Oracle通过一个内部参数_small_table_threshold来定义大表和小表的界限。缺省的该参数等于2%的Buffer数量,如果表的大小小于该参数定义,Oracle认为该表为小表,否则Oracle认为该表为大表。
网管bitscn_com

  我们看一下Oracle9iR2中的情况: 网管网www_bitscn_com

SQL> @@GetParDescrb.sql
Enter value for par: small
old   6:    AND x.ksppinm LIKE '%&par%'
new   6:    AND x.ksppinm LIKE '%small%' 网管有家www.bitscn.net

NAME                    VALUE                DESCRIB
------------------------------ -------------------- ------------------------------------------------------------
_small_table_threshold         200                  threshold level of table size for direct reads
中国网管论坛bbs.bitsCN.com

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

网管u家u.bitsCN.com

SQL> show parameter db_cache_size 网管u家www.bitscn.net

NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
db_cache_size                        big integer 83886080
SQL> select (83886080/8192)*2/100 from dual;

网管u家www.bitscn.net

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

中国网管联盟bitsCN.com

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

TAGs   扫描   数据库   table   scans   tables   全表   0.0   对于   Oracle      
 上一篇:Oracle的客户端工具--sql*plus   下一篇:获得Export/Import的trace文件
Oracle数据库的大表,小表与全表扫描 评论:
loading.. 评论加载中…
评论:请自觉遵守互联网相关政策法规,评论不得超过250字。

验证码: 注册用户
本类热门排行:
最新推荐文章:
网管论坛交流: