【发布时间】:2015-01-17 06:45:43
【问题描述】:
所以我有这个巨大的表 SS(someID, someDate, ...)。我需要将此表的一个子集连接到另一个表。子集由以下方式确定:select * from SS where someID in(select someID from SS where someDate is between date1 and date2)。
在 Oracle XA 数据服务器上并行运行时,执行耗时较长,需要占用 TEMP 空间,尽管 Oracle 可以在 SS 表上实现 99% 的单元卸载效率,但子集查询仍会带回大量与其他表连接时将数据发送到数据库服务器。
有什么办法可以提高效率吗?例如 Oracle 不必发回尽可能多的数据并利用更多的单元卸载效率?
下面是查询计划
PLAN_TABLE_OUTPUT
Plan hash value: 3198983388
---------------------------------------------------------------------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time | TQ |IN-OUT| PQ Distrib |
---------------------------------------------------------------------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 1044K| 589M| 46101 (1)| 00:01:33 | | | |
| 1 | PX COORDINATOR | | | | | | | | |
| 2 | PX SEND QC (RANDOM) | :TQ10003 | 1044K| 589M| 46101 (1)| 00:01:33 | Q1,03 | P->S | QC (RAND) |
|* 3 | HASH JOIN BUFFERED | | 1044K| 589M| 46101 (1)| 00:01:33 | Q1,03 | PCWP | |
| 4 | PX RECEIVE | | | | | | Q1,03 | PCWP | |
| 5 | PX SEND HASH | :TQ10001 | | | | | Q1,01 | P->P | HASH |
| 6 | NESTED LOOPS | | | | | | Q1,01 | PCWP | |
| 7 | NESTED LOOPS | | 523K| 135M| 38264 (1)| 00:01:17 | Q1,01 | PCWP | |
| 8 | SORT UNIQUE | | 29402 | 401K| 13751 (1)| 00:00:28 | Q1,01 | PCWP | |
| 9 | PX RECEIVE | | 29402 | 401K| 13751 (1)| 00:00:28 | Q1,01 | PCWP | |
| 10 | PX SEND HASH | :TQ10000 | 29402 | 401K| 13751 (1)| 00:00:28 | Q1,00 | P->P | HASH |
| 11 | PX BLOCK ITERATOR | | 29402 | 401K| 13751 (1)| 00:00:28 | Q1,00 | PCWC | |
|* 12 | INDEX STORAGE FAST FULL SCAN| SUPERSET_IDX1 | 29402 | 401K| 13751 (1)| 00:00:28 | Q1,00 | PCWP | |
|* 13 | INDEX RANGE SCAN | XU_SUPERSET_01 | 18 | | 1 (0)| 00:00:01 | Q1,01 | PCWP | |
| 14 | TABLE ACCESS BY INDEX ROWID | SUPERSET | 18 | 4644 | 2 (0)| 00:00:01 | Q1,01 | PCWP | |
| 15 | PX RECEIVE | | 2886K| 880M| 7834 (2)| 00:00:16 | Q1,03 | PCWP | |
| 16 | PX SEND HASH | :TQ10002 | 2886K| 880M| 7834 (2)| 00:00:16 | Q1,02 | P->P | HASH |
| 17 | PX BLOCK ITERATOR | | 2886K| 880M| 7834 (2)| 00:00:16 | Q1,02 | PCWC | |
| 18 | TABLE ACCESS STORAGE FULL | POL_DTL | 2886K| 880M| 7834 (2)| 00:00:16 | Q1,02 | PCWP | |
---------------------------------------------------------------------------------------------------------------------------------------
Predicate Information (identified by operation id):
---------------------------------------------------
3 - access(SS.POL_ID=PD.POL_ID)
12 - storage(IMPT_DT<=TO_DATE(' 2014-11-20 00:00:00', 'syyyy-mm-dd hh24:mi:ss') AND IMPT_DT>=TO_DATE(' 2014-10-28
00:00:00', 'syyyy-mm-dd hh24:mi:ss'))
filter(IMPT_DT<=TO_DATE(' 2014-11-20 00:00:00', 'syyyy-mm-dd hh24:mi:ss') AND IMPT_DT>=TO_DATE(' 2014-10-28
00:00:00', 'syyyy-mm-dd hh24:mi:ss'))
13 - access(SS.POL_ID=POL_ID)
Note
-----
- Degree of Parallelism is 4 because of session
【问题讨论】:
-
select * from SS where someID in (select someID from SS where someDate is between date1 and date2).这真的可以称为self join吗?或者它是一个相关的子查询?我不知道这是否会改变优化器的某些东西...无论如何,如果没有查询计划,很难回答这样的问题。 -
我认为
select * from SS where someDate is between date1 and date2返回的结果与您的查询相同,所以我不太明白这一点 -
我已经添加了执行统计和计划。如您所见,有很多活动......
-
请运行命令:
EXPLAIN PLAN FOR your_query_goes_here ;,然后运行SELECT * FROM table(DBMS_XPLAN.DISPLAY),最后请将最后一个查询的结果复制到剪贴板(以文本格式),并将其粘贴到答案中。图像很漂亮,但很难阅读。谢谢。 -
我不确定如何从计划中保留表格格式。每次我复制/粘贴到这里它都会丢失所有格式:(如果你右键单击图像,然后在新选项卡中打开,它应该显示得很清楚。我从 Oracle Enterprise Manager 拍摄了这张快照
标签: oracle performance join oracle11g subquery