Oracle 解释计划中的行表示什么?
这是我的问题:Oracle 解释计划中的行表示什么?,oracle,Oracle,这是我的问题: SELECT payload_data FROM staging_record WHERE record_source = 11; 这是执行计划: ------------------------------------------------------------------------------------------------ | Id | Operation | Name | Rows | Bytes
SELECT payload_data FROM staging_record WHERE record_source = 11;
这是执行计划:
------------------------------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
------------------------------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 9016 | 1875K| 292 (1)| 00:00:05 |
| 1 | TABLE ACCESS BY INDEX ROWID| STAGING_RECORD | 9016 | 1875K| 292 (1)| 00:00:05 |
|* 2 | INDEX RANGE SCAN | IX_RECORD_SOURCE | 9016 | | 15 (0)| 00:00:01 |
------------------------------------------------------------------------------------------------
Predicate Information (identified by operation id):
---------------------------------------------------
2 - access("RECORD_SOURCE"=11)
我做了一次计数,它返回了带有此查询的22619
SELECT COUNT(*) FROM staging_record WHERE record_source = 11;
当我的计数返回22619时,为什么行列显示为9016。这里的
行是指什么?您的标记已过时。刷新统计数据(使用DBMS\u stats
),您将获得更准确的值
行
是指在查询执行期间受影响的行数(根据标记信息,近似值)。9016是优化器基于其统计信息的估计值。如果表有901600行,并且记录源有100个不同的值,那么优化器可能会估计记录源的典型查询将返回901600/100=9016行。实际数据的倾斜可能会使其不准确(它永远不会完美)。如果数据非常倾斜,则可以使用直方图进一步细化统计数据。如何更新统计数据?这是通过分析表暂存记录计算统计数据实现的吗?因为这没有帮助:|@JavaRocky:查找一些DBMS\u统计数据
sample。现在我已经在家了,没有任何完整的命令。虽然统计数据可能已经过时,但这里没有明确的证据表明这就是原因。根据Tony的回答,更大的问题是统计数据给出的实际数据的完整程度。@Dave Costa:oops,是的,忘记了行
实际上是一个基数
,我想补充一点,估计不正确的事实不一定是一个问题。如果查询使用的是一个性能良好的合理执行计划,那么它可能很好。如果估计值偏离了一个数量级或更大的数量级,那就更有可能成为一个问题。