oracle数据库有那些表,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)

828table 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

% TotalEvent

Waits

Time (cs)

Wt Time-------------------------------------------- ------------ ------------ -------log file parallel write

1,436,993

1,102,188

10。

80log buffer space

16,698

873,203

8。56log file sync

1,413,374

654,587

6。42control file parallel write

329,777

510,078

5。

00db file scattered read

425,578

132,537

1。30

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

Oracle通过一个内部参数_small_table_threshold来定义大表和小表的界限。

缺省的该参数等于2%的Buffer数量,如果表的大小小于该参数定义,Oracle认为该表为小表,否则Oracle认为该表为大表。

我们看一下Oracle9iR2中的情况:SQL> @@GetParDescrb。sqlEnter value for par: smallold

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_sizeNAME

TYPE

VALUE------------------------------------ ----------- ------------------------------db_cache_size

big integer 83886080SQL> 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,以使得内存使用更加有效。

全部

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值