"对函数以及表达式收集统计信息是Oracle数据库11g版本引入的一个功能,目的是为了优化查询优化器的执行计划。在描述中提到,当where条件涉及到特定函数(如function_name(table_name.column_name)=’XXX’)时,优化器通常会假设选择性为1%,这可能导致不准确的执行计划。从11g开始,我们可以通过创建虚拟列并为函数或表达式收集统计信息来改善这种情况。
要实现这一功能,首先需要使用`dbms_stats.create_extended_stats`函数创建一个与函数或表达式关联的虚拟列。例如,对于长度函数`length(C1)`,可以执行以下SQL:
```sql
select dbms_stats.create_extended_stats('Schema_name','Table_name','length(C1)') from dual;
```
对于乘法表达式`C1*C2`,同样可以创建虚拟列:
```sql
select dbms_stats.create_extended_stats('Schema_name','Table_name','C1*C2') from dual;
```
随后,可以使用`dbms_stats.gather_table_stats`收集表的统计信息,包括虚拟列的统计信息,例如:
```sql
exec dbms_stats.gather_table_stats('Schema_name','Table_name', method_opt=>'for columns (length(C1)) size AUTO');
```
这将为`length(C1)`对应的虚拟列收集统计信息,包括可能的直方图。
私有的统计信息存储在 `_PRIVATE_STATS` 中,测试这些信息的方法有两种:
1. 使用`DBMS_STAT.EXPORT_PRIVATE_STATS`将私有统计信息转移到自定义的统计信息表,然后通过`expdp`和`impdp`在测试环境中导入和导出。
2. 在会话级别设置`OPTIMIZER_PRIVATE_STATISTICS`参数为`TRUE`,这样优化器在解析SQL时会参考这些私有统计信息。
这个功能对于提升Oracle数据库的运维性能至关重要,特别是对于那些依赖复杂函数或表达式的查询。通过更精确的统计信息,优化器能够生成更高效的执行计划,从而改善整体系统性能。在实际运维中,数据库管理员应定期检查和更新这些统计信息,以确保查询优化器做出正确的决策。"
此资源属于Oracle运维领域,涉及的知识点包括Oracle数据库的性能优化、查询优化器的工作原理、统计信息的收集与管理,以及与之相关的数据库运维最佳实践。