作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
当涉及到 v$sql_plan_monitor
时,我遇到了一些奇怪的现象。 Oracle 11.2 上的表。
我有两张大小合适的 table 。一个有大约 2500 万行,另一个大约有 3500 万行,两者都是约 99% 的唯一性,只有少量的重复记录。
解释计划如下(表名代替隐私,表在解释计划之前收集了统计信息):
--------------------------------------------------------------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time | TQ |IN-OUT| PQ Distrib |
--------------------------------------------------------------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | | | 65611 (100)| | | | |
| 1 | SORT AGGREGATE | | 1 | 34 | | | | | |
| 2 | PX COORDINATOR | | | | | | | | |
| 3 | PX SEND QC (RANDOM) | :TQ10002 | 1 | 34 | | | Q1,02 | P->S | QC (RAND) |
| 4 | SORT AGGREGATE | | 1 | 34 | | | Q1,02 | PCWP | |
|* 5 | FILTER | | | | | | Q1,02 | PCWC | |
|* 6 | HASH JOIN OUTER | | 234K| 7770K| 65611 (1)| 00:19:41 | Q1,02 | PCWP | |
| 7 | PX RECEIVE | | 23M| 513M| 26409 (1)| 00:07:56 | Q1,02 | PCWP | |
| 8 | PX SEND HASH | :TQ10000 | 23M| 513M| 26409 (1)| 00:07:56 | Q1,00 | P->P | HASH |
| 9 | PX BLOCK ITERATOR | | 23M| 513M| 26409 (1)| 00:07:56 | Q1,00 | PCWC | |
|* 10 | TABLE ACCESS FULL| PRETTY_BIG_TABLE | 23M| 513M| 26409 (1)| 00:07:56 | Q1,00 | PCWP | |
| 11 | PX RECEIVE | | 36M| 384M| 39164 (1)| 00:11:45 | Q1,02 | PCWP | |
| 12 | PX SEND HASH | :TQ10001 | 36M| 384M| 39164 (1)| 00:11:45 | Q1,01 | P->P | HASH |
| 13 | PX BLOCK ITERATOR | | 36M| 384M| 39164 (1)| 00:11:45 | Q1,01 | PCWC | |
|* 14 | TABLE ACCESS FULL| EVEN_BIGGER_TABLE | 36M| 384M| 39164 (1)| 00:11:45 | Q1,01 | PCWP | |
--------------------------------------------------------------------------------------------------------------------------------
Rows
HASH JOIN OUTER
的值步。
LEFT JOIN
的反连接和一个
WHERE
过滤空记录。
sql_id
在
v$sql_plan_monitor
table :
1 SELECT
2 plan_line_id,
3 plan_operation,
4 ROUND(MAX(plan_cardinality) / 1000) AS est_krows,
5 ROUND(SUM(output_rows) / 1000) AS actual_krows
6 FROM v$sql_plan_monitor
7 WHERE sql_id = 'sql_id_goes_here'
8 GROUP BY sql_id, sql_exec_id, sql_exec_start, plan_line_id, plan_operation
9* ORDER BY sql_exec_id, plan_line_id
SQL> /
PLAN_LINE_ID PLAN_OPERATION EST_KROWS ACTUAL_KROWS
------------ ------------------------------ ---------- ------------
0 SELECT STATEMENT 0
1 SORT 0 0
2 PX COORDINATOR 0
3 PX SEND 0 0
4 SORT 0 0
5 FILTER 0
6 HASH JOIN 234 23084866
7 PX RECEIVE 23402 23168
8 PX SEND 23402 23168
9 PX BLOCK 23402 23168
10 TABLE ACCESS 23402 23168
11 PX RECEIVE 36699 17772
12 PX SEND 36699 17748
13 PX BLOCK 36699 17748
14 TABLE ACCESS 36699 17748
actual_krows
值(value)正在增长。
最佳答案
为什么估计是错误的?
因为,理论上,it is impossible to predict if a program will ever finish ,更不用说预测需要多长时间了。而且,实际上,估计是困难的,Oracle 只有 satisficing 的时间。 ; Oracle 不知道查询是每天提交一次还是每秒提交一千次,因此无法花费大量时间来决定。
我们如何改进估计?
查看整个查询并了解有关表结构和数据分布的一些信息可能会有所帮助。这是很多信息,不能保证它会有所帮助。相反,这里有一堆可能对调整基数有用的方法。根据您的查询、 session 、环境等,并非所有这些都会有所帮助。
NVL
表达式有时可以用 OR
写得更好. OPT_ESTIMATE
和 CARDINALITY
提示可以帮助弥补错误的估计。 OPT_ESTIMATE
是 SQL 配置文件使用的内容,并且是说“嘿,将基数增加 1000%”的好方法。 CARDINALITY
是说“整个查询将返回 X 行”的简单方法。但是这些提示很难使用。 关于sql - v$sql_plan_monitor - JOIN 估计非常不准确?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27431455/
当涉及到 v$sql_plan_monitor 时,我遇到了一些奇怪的现象。 Oracle 11.2 上的表。 我有两张大小合适的 table 。一个有大约 2500 万行,另一个大约有 3500 万
我是一名优秀的程序员,十分优秀!