如果我理解documentation correctly;完整提示应强制进行全表扫描。在下面的场景中,它的表现并不相同;
在创建的索引中为Num。
SQL> desc test;
Name Null? Type
----------------------------------------- -------- ----------------------------
NUM NOT NULL NUMBER
NUM2 NUMBER(10)
NUM3 NUMBER
select num from test;
NUM
----------
1
2
Plan hash value: 410557223
-------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
-------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 2 | 4 | 1 (0)| 00:00:01 |
| 1 | INDEX FULL SCAN | ID | 2 | 4 | 1 (0)| 00:00:01 |
-------------------------------------------------------------------------
select /* +full(test) */ num from test;
NUM
----------
1
2
Plan hash value: 410557223
-------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
-------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 2 | 4 | 1 (0)| 00:00:01 |
| 1 | INDEX FULL SCAN | ID | 2 | 4 | 1 (0)| 00:00:01 |
-------------------------------------------------------------------------
我理解我正在选择存储在索引中的值。添加任何其他列使扫描完整。因此我不得不问明显的。是提示请求还是对优化器的命令?
另一方面,统计计算与优化有什么关系。索引的统计信息是自动更新还是显式操作?
答案 0 :(得分:7)
我没有对此进行测试,但使用提示的正确语法是:
select /*+ full(test) */ num from test;
这是斜线加星空间。
答案 1 :(得分:5)
“在旁注中,统计计算必须做什么 优化。是统计数据 索引自动更新或 这是一个明确的操作吗?“
可能本身就有一个问题(它肯定比你的主要问题更为恰当:-D)。
Oracle不会自动为所有对象维护100%的统计信息。在10g之前,我们必须使用DBMS_STATS.GATHER _%_ STATISTICS显式安排后台作业。
由于11g Oracle改变了默认行为。它监视针对模式发出的DML,并运行作业以在现有统计信息变得陈旧时收集对象的统计信息。即便如此,它只计算一定比例的行的统计数据。这通常是足够好的,特别是对于大型表,当检查所有行时会很昂贵。
此默认行为本身通常是足够好的。如果您遇到错误的查询计划问题,可能需要收集新的统计信息,可能需要针对更大的行样本。但是并不觉得有必要经常收集整个模式的完整统计数据,因为很多地方仍然这样做。大多数时候你可能只是在浪费CPU周期,而且你冒着破坏你现有计划的风险的风险。
数据库统计是一个很大的话题。性能调优指南有一整章。 Find out more.另外,请阅读PL/SQL Packages guide for more on DBMS_STATS本身。