这几天有几个分区表上的SQL执行计划不正常, 感觉上不应当, 已经设置了几个容易引起优化器选错执行计划的参数了.
ALTER SYSTEM SET OPTIMIZER_DYNAMIC_SAMPLING=0;
ALTER SYSTEM SET "_optim_peek_user_binds"=false;
按照现行的表分析原则, 只统计了表的全局索引, 不统计表分区上的索引, 因为分区会有增减操作, 不是每个分区都有数据,
也没有定下来要经常分析表, 而是分析后如果不出问题就不再分析. 现在SQL走错了, 可能的原因有什么呢? 重新分析一下不行, 看了一下执行计划,
发现全表扫描的COST值很底, 估计是用了分区上的统计信息了, 于是手动将全局的统计信息复制到每一个分区上得以解决.
为了得到原因, 回顾了一下当时的SQL, 发现有一个特征, 就是出问题的SQL都能定位到某个分区或某些分区,
今天就模拟了一下情况, 先只有全局统计信息. 首先用分区列范围查询, 去试了一下, 发现用的是分区级的统计信息.
SQL> select * from database_perf_statistics
2 where day > sysdate - 100 and day < sysdate + 300;
----------------------------------------------------------------
| Id | Operation | Cost (%CPU)| Pstart| Pstop |
----------------------------------------------------------------
| 0 | SELECT STATEMENT | 3 (0)| | |
|* 1 | FILTER | | | |
| 2 | PARTITION RANGE ITERATOR| 3 (0)| KEY | KEY |
|* 3 | TABLE ACCESS FULL | 3 (0)| KEY | KEY |
----------------------------------------------------------------
然后全表扫描, 涉及所有的分区时, 用的是全局的统计信息.
SQL> select * from database_perf_statistics;
----------------------------------------------------------
| Id | Operation | Cost (%CPU)| Pstart| Pstop |
----------------------------------------------------------
| 0 | SELECT STATEMENT | 2196 (1)| | |
| 1 | PARTITION RANGE ALL| 2196 (1)| 1 | 4 |
| 2 | TABLE ACCESS FULL | 2196 (1)| 1 | 4 |
----------------------------------------------------------
再测试一个开包的查询条件, 发现用的也是分区的统计信息.
SQL> select * from database_perf_statistics where day > sysdate -
100;
---------------------------------------------------------------
| Id | Operation | Cost (%CPU)| Pstart| Pstop |
---------------------------------------------------------------
| 0 | SELECT STATEMENT | 3 (0)| | |
| 1 | PARTITION RANGE ITERATOR| 3 (0)| KEY | 4 |
|* 2 | TABLE ACCESS FULL | 3 (0)| KEY | 4 |
---------------------------------------------------------------
重新设置了一下各分区的统计信息, 再验证一下上面的SQL的COST值, 就确定了是这个原因引起的, 需要更改一下我们的分析策略了.
分享到:
相关推荐
此外,定期分析和优化分区表的统计信息,可以确保查询计划器准确评估数据分布,从而做出更优的查询优化决策。 #### 分区与并行处理 对于多处理器系统,分区的另一个显著优势是支持并行操作。当数据分布在多个分区...
**JCR期刊分区表**是通过统计和分析全球范围内各类学术期刊的引用情况,对期刊进行分类评级的工具。这一表格由Clarivate Analytics发布,每年更新一次。在地学领域,2007年的分区表中包括了期刊的简称、全称、ISSN号...
- **功能**:提供了更高级的统计信息收集功能,尤其适用于大型分区表。 - **常用过程**: - `dbms_stats.gather_table_stats`: 收集表、列和索引的统计信息。 - `dbms_stats.gather_schema_stats`: 收集模式下所有...
在数据仓库系统中,由于通常包含大量数据并支持复杂的用户报告需求,统计信息的维护尤其重要,而这些系统往往使用分区表和索引来进一步增加管理的复杂性。本文将深入探讨在Oracle 10.2环境下实施大型DW系统时遇到的...
通过将数据按照交易时间进行分区,可以在不加载全部数据的情况下快速获取特定时间段内的交易统计信息,这对于实时分析和决策支持系统尤为重要。 总之,在Oracle数据库中处理大规模数据时,合理利用表空间管理和分区...
本篇将通过一个具体的示例来介绍如何使用PostgreSQL中的`CASE WHEN`语句结合`SUM`聚合函数实现区间或分数段统计,并且无需创建视图即可完成这一任务。 #### SQL 语法详解 首先,我们来看一下给定的SQL查询语句: ...
索引碎片整理、分区表策略和填充因子的调整等都是索引优化中需要考虑的因素。 除了索引和统计数据更新之外,查询本身的设计也直接影响性能。例如,避免在WHERE子句中使用函数,这样可以避免阻止查询优化器使用索引...
接着,使用 analyze table 语句重新分析表的统计信息,以便提高查询效率。 analyze 语句的作用是收集表的统计信息,以便优化查询效率。analyze 语句有多种形式,例如 analyze table tablename compute statistics,...
7. **granularity**:粒度控制,用于分区表,决定了统计信息收集的详细程度,如全局、分区、子分区等。 8. **stattab** 和 **statown**:用户可以选择将统计信息保存在特定的表和架构中。 9. **statid**:一个可选...
在实际操作中,使用Oracle的`CREATE TABLE`语句创建分区表,可以指定`PARTITION BY`子句定义分区方式。同时,`ALTER TABLE`语句可用于添加、删除或合并分区。为了充分利用分区优势,需要编写针对分区设计的SQL查询,...
除了常规的表和索引统计信息之外,还可能需要收集其他类型的统计信息,例如分区统计信息、表关联统计信息等。这些统计信息对于更复杂查询的优化非常重要。 - **分区统计信息**:当表被分区时,每个分区都应单独收集...
1. **对于分区表**:建议使用 `DBMS_STATS` 而不是 `ANALYZE` 语句,因为 `DBMS_STATS` 支持并行处理、可以收集整个分区表的数据以及单个分区的数据,并且可以在不同级别上计算统计信息。 2. **对于非分区表**:同样...
Oracle数据库的统计信息是优化器做出执行计划的重要依据,它包括了表的大小、分区信息、列的分布情况等。当面临数据库迁移、性能调整等情况时,保持统计信息的一致性至关重要。本文将深入探讨Oracle统计信息的导出...
- **使用分区表的原因**:分区表能够提高数据访问速度,特别是针对大规模数据集时,通过将数据分散存储于不同的物理位置,实现并行读取,从而提高整体性能。 - **分区表建表语法**: ```sql CREATETABLE 表名 LIKE...
压缩包主要包括如下文件: 1,迁移表的导出,生成备份文件;...8,删除新创建的分区表。 9,创建原来存储过程使用的临时表;将重命名的表进行恢复;将备份的数据重新导入数据库。 当然,还包括有相关的恢复脚本。
使用分区表和分片技术可以进一步优化大数据量的查询。 4. **数据库维护**:定期进行统计信息收集和分析,更新索引统计信息,确保Oracle数据库能够准确估计查询的执行计划。定期重构和重建索引,清理无用的数据和...
标题“统计SLA的SQL”涉及的是在数据库管理和数据分析领域中的服务级别协议(Service Level Agreement,简称SLA)的统计方法。SLA通常用于衡量服务质量,例如系统可用性、响应时间和错误处理时间等。在IT行业中,...
- Hive的元数据包括表名、列名、分区信息等,这些元数据通常存储在一个关系型数据库(如MySQL、Derby)中。元数据管理是Hive的核心功能之一,它帮助Hive理解数据的结构并指导数据的读取和写入。 3. **Hive的数据...