oracle数据库:Oracle数据库的大表 小表和全表扫描

="t18">   通常对于小表Oracle建议通过全表扫描进行数据访问对于大表则应该通过索引以加快数据查询当然假如查询要求返回表中大部分或者全部数据那么全表扫描可能仍然是最好选择
  从V$SYSSTAT视图中我们可以查询得到有关全表扫描系统统计信息:
SQL> col name for a30
SQL> select name,value from v$sysstat
2 where name in ('table scans ( tables)','table scans (long tables)'); NAME VALUE
------------------------------ ----------
table scans ( tables) 828
table scans (long tables) 101   其中table scans ( 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 ( tables) 1,185,275 1.2 0.8
  通常假如个数据库table scans (long tables)过多那么db file scattered read等待事件可能同样非常显著和以上数据来自同个reportTop5等待事件就是如此: 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%'
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 eger 83886080
SQL> select (83886080/8192)*2/100 from dual; (83886080/8192)*2/100
---------------------
204.8   所以要区分大小表(Long/Short)是全表扫描可能引起Buffer Cache抖动缺省大表全表扫描会被置于LRU末端以期尽快老化减少Buffer占用从Oracle8i开始Oracle多缓冲池治理技术(Default/Keep/Recycle池)给了我们另外个选择对于区别大小、区别使用频率数据表从建表的初就可以指定其存储Buffer以使得内存使用更加有效
Tags:  oracle创建数据库 oracle数据库恢复 oracle数据库备份 oracle数据库

延伸阅读

最新评论

发表评论