Oracle数据库统计信息:揭秘统计信息收集和利用,提升查询优化,加速数据检索
发布时间: 2024-08-03 09:40:30 阅读量: 70 订阅数: 35
![Oracle数据库统计信息:揭秘统计信息收集和利用,提升查询优化,加速数据检索](https://obbusiness-private.oss-cn-shanghai.aliyuncs.com/doc/img/observer-enterprise/V4.2.1/manage/histogram.png)
# 1. Oracle数据库统计信息概述**
统计信息是Oracle数据库中收集的关于表、索引和列的数据分布和访问模式的信息。这些信息对于查询优化器至关重要,因为它使用这些信息来估计查询执行成本并生成执行计划。
统计信息包括诸如行数、块数、平均行长度、唯一值数和直方图等信息。这些信息可以帮助优化器了解表中数据的分布,并预测访问模式。
维护准确的统计信息对于查询性能至关重要。过时的或不准确的统计信息会导致优化器生成低效的执行计划,从而导致查询性能下降。
# 2. 统计信息收集与维护**
**2.1 自动统计收集机制**
Oracle数据库提供了自动统计收集机制,在以下情况下自动收集统计信息:
* **DDL操作:**创建、修改或删除表、索引、分区或约束时。
* **DML操作:**插入、更新或删除大量数据时。
* **定期任务:**数据库会定期运行自动统计收集作业,默认间隔为7天。
**2.1.1 GATHER_STATS_JOB**
自动统计收集作业由名为GATHER_STATS_JOB的数据库作业执行。该作业使用以下参数:
| 参数 | 说明 |
|---|---|
| METHOD_OPT | 指定统计收集方法,默认值为FOR ALL COLUMNS SIZE AUTO。 |
| DEGREE | 指定用于收集统计信息的并行度,默认值为0(串行)。 |
| ESTIMATE_PERCENT | 指定收集统计信息的表数据百分比,默认值为100。 |
**2.1.2 统计收集方法**
自动统计收集作业可以使用以下方法收集统计信息:
* **FOR ALL COLUMNS SIZE AUTO:**为所有列收集精确的统计信息,包括表大小。
* **FOR ALL COLUMNS SIZE SKEWONLY:**为所有列收集精确的统计信息,但仅为偏斜列收集大小统计信息。
* **FOR ALL INDEXED COLUMNS:**仅为索引列收集精确的统计信息。
* **FOR RANGE COLUMNS:**仅为范围列收集精确的统计信息。
**2.2 手动统计收集方法**
除了自动统计收集机制外,还可以使用以下方法手动收集统计信息:
* **GATHER_TABLE_STATS:**收集指定表的统计信息。
* **GATHER_INDEX_STATS:**收集指定索引的统计信息。
* **GATHER_DICTIONARY_STATS:**收集字典统计信息,用于优化基于哈希的连接。
**2.2.1 GATHER_TABLE_STATS**
```sql
GATHER TABLE_STATS
TABLE schema.table_name
[METHOD_OPT => FOR ALL COLUMNS SIZE AUTO]
[ESTIMATE_PERCENT => 100]
[GRANULARITY => ALL]
[CASCADE => TRUE];
```
* **METHOD_OPT:**指定统计收集方法,默认为FOR ALL COLUMNS SIZE AUTO。
* **ESTIMATE_PERCENT:**指定收集统计信息的表数据百分比,默认为100。
* **GRANULARITY:**指定统计收集粒度,默认为ALL(收集所有列的统计信息)。
* **CASCADE:**指定是否级联收集子分区或子表的统计信息,默认为TRUE。
**2.2.2 GATHER_INDEX_STATS**
```sql
GATHER INDEX_STATS
INDEX schema.index_name
[METHOD_OPT => FOR ALL COLUMNS SIZE AUTO]
[ESTIMATE_PERCENT => 100];
```
* **METHOD_OPT:**指定统计收集方法,默认为FOR ALL COLUMNS SIZE AUTO。
* **ESTIMATE_PERCENT:**指定收集统计信息的索引数据百分比,默认为1
0
0