通常对于小表,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全表扫描的三种优化手段 在Oracle数据库管理中,全表扫描(Full Table Scan,简称FTS)是指查询语句对整个表的数据进行读取的一种操作方式。当索引选择性较差或者表较小的时候,Oracle可能会选择全表扫描...
Oracle全表扫描是一种数据库操作,它是访问数据库表数据的主要方式之一。当Oracle处理SQL查询时,如果选择全表扫描,那么它将遍历表中所有数据块以获取所需信息。这种扫描方式涉及到读取表中每一行,实际上,是读取...
Oracle 表的扫描方式是指 Oracle 访问表的方法,包括全表扫描、索引扫描、索引范围扫描、索引唯一扫描等。这些扫描方式的选择取决于查询的条件、索引的类型和数据的分布。 一、全表扫描(Full Table Scans, FTS) ...
这包括正确使用索引、合理设计表结构、避免全表扫描以及有效利用分区技术。在Oracle中,索引是提高查询速度的关键,特别是B树索引和位图索引。B树索引适用于单列查询和范围查询,而位图索引则适合于多列组合查询或在...
- 减少RB的I/O:通过使用`CACHE`和`FULL`提示对源表执行全表扫描(FTS),使其尽可能多地进入buffer cache。 - 减少RC的I/O:设置更大的`SORT_AREA_SIZE`参数(若未使用PGA_AGGREGATE_TARGET则直接设置)。 - ...
全表扫描是 Oracle 访问路径的一种,最基本的访问方式。它扫描整个表,检查每一行记录,以找到匹配的记录。全表扫描通常用于以下情况: * 表非常小,扫描整个表的成本较低。 * 无法使用索引,因为索引不包含查询所...
2. **避免跨分区操作**:设计应用程序时,尽量避免全表扫描和跨分区的JOIN操作。 3. **考虑分区边界**:合理设置分区边界,确保新数据能自动落入正确分区。 4. **利用分区修剪**:通过编写明智的SQL语句,让数据库...
3. **避免全表扫描**:尽可能利用索引,减少对大表的全表扫描。 4. **使用适当的连接方式**:理解并正确使用内连接、外连接和自连接,避免笛卡尔积等问题。 5. **限制返回结果集**:使用`LIMIT`或`ROWNUM`限制查询...
全表扫描是最基础的数据访问方式,当执行全表扫描时,Oracle会遍历表中的所有记录,检查每一行是否满足WHERE条件。这种方式下,Oracle会按照顺序读取分配给该表的每一个数据块,确保每个数据块仅被读取一次,从而...
索引的优化涉及多个方面,包括选择合适的索引类型、考虑查询模式、避免全表扫描、维护索引的粒度等。例如,对于频繁查询的列创建索引,对于低选择性的列(即大部分行有相同值的列)可能不适合创建普通索引,而更适合...
Oracle数据库中的多表关联UPDATE语句是用于在一个表中更新数据时,依据另一个表的条件进行操作的...在实际应用中,一定要确保关联条件正确无误,避免不必要的数据更改,同时注意性能优化,减少全表扫描和提高查询效率。
这时候成本接近于全表扫描小表+分区数*全表扫描大表的代价和。至于两个表都进行分区,其好处是可以使用parallel query,就是多个进程同时对不同的分区进行join,然后再合并。但是复杂。使用hash join时,HASH_AREA_...
- **表级锁(TABLE LOCK)**:锁定整个表,适用于全表扫描或批量操作。 - **行级意向锁(INTENTION LOCKS)**:用于多粒度锁定,表明接下来的锁定将是行级或表级。 2. **锁模式**: - **共享锁(SHARE LOCK)**...
当进行全表扫描时,Oracle会读取高水位下的所有数据块,即使这些数据块包含大量空闲空间(即碎片)。这种情况下,读取这些空闲数据块会显著降低全表扫描的性能。 此外,行链接和行迁移也会导致表碎片的产生。行链接...
其次,索引的选择应考虑全列扫描和部分列扫描的情况,避免过度索引导致写操作性能下降。此外,应考虑使用覆盖索引,即索引包含查询所需的所有列,以减少回表操作。 在实际操作中,使用数据库设计工具如...
排序合并连接主要用于处理大规模数据的连接,尤其是当两个表都需要全表扫描时。它的工作原理如下: - 首先对两个表的连接列进行排序。 - 然后逐行比较两个已排序的表,找到匹配的行。 - 这种连接方法通常在两个大...
B\*Tree索引特别适用于当所需检索的行数占总行数比例较低的情况,此时相比全表扫描,B\*Tree索引能提供更高效的检索方式。 B\*Tree索引的树结构中,叶块位于树的底部,包含被索引列的值及其对应的rowid。分支块则...
- 如果缺少有效的索引或者查询条件不够明确,则该连接类型可能会导致大量的全表扫描,从而严重影响性能。 #### 二、排序合并连接(USE_MERGE) **主要消耗的相关资源:** - 内存 - 临时表空间 **特点:** - 排序...
HWM在数据删除时不移动,全表扫描时会读取所有低于HWM的数据块,即使某些块可能已无数据。在删除大量数据时,使用`DELETE`会保留HWM,而`TRUNCATE`则会重置HWM,但需要注意`TRUNCATE`无法回滚且会释放表空间,适用于...
- 建议:当更新的数据量接近整个表时,应考虑采用全表扫描而非依赖索引。 6. **并行处理** - 如果服务器具备多CPU配置,可以利用并行处理(Parallel Processing)来提高操作效率。并行处理允许同时在多个处理器...