oracle中执行计划问题(高手进啊)

[复制链接]
查看11 | 回复3 | 2014-2-18 16:47:53 | 显示全部楼层 |阅读模式
SQL如下:
SELECT *
FROM (SELECT *

FROM ( SELECT P.*,

ROW_NUMBER() OVER(PARTITION BY ACCTNO ORDER BY SORTNO) AS RK

FROM TEST_FDM_KNA_ORBK P

WHERE P.AS_OF_DATE = TO_DATE(20120131, 'YYYYMMDD')

)

WHERE RK = 1
) B
WHERE B.ACCTNO IN
(SELECT CASE

WHEN SUM(B.ACCTFS) OVER(PARTITION BY P.ACCTNO) =

COUNT(1) OVER(PARTITION BY P.ACCTNO)

THEN P.ACCTNO

END

FROM TEST_FDM_KNA_ORBK P

WHERE AS_OF_DATE = TO_DATE(20120131, 'YYYYMMDD')

AND MINUS_ONLNBAL0
);
执行计划如下:
Plan hash value: 121659835

-----------------------------------------------------------------------------------------------
| Id| Operation
| Name
| Rows| Bytes | Cost (%CPU)| Time |
-----------------------------------------------------------------------------------------------
| 0 | SELECT STATEMENT
|
| 1 |40 | 6(34)| 00:00:01 |
|*1 |FILTER
|
| | |
|
|
|*2 | VIEW
|
|12 | 480 | 3(34)| 00:00:01 |
|*3 |WINDOW SORT PUSHED RANK|
|12 | 564 | 3(34)| 00:00:01 |
|*4 | TABLE ACCESS FULL | TEST_FDM_KNA_ORBK |12 | 564 | 2 (0)| 00:00:01 |
|*5 | FILTER
|
| | |
|
|
| 6 |WINDOW SORT
|
| 1 |44 | 3(34)| 00:00:01 |
|*7 | TABLE ACCESS FULL | TEST_FDM_KNA_ORBK | 1 |44 | 2 (0)| 00:00:01 |
-----------------------------------------------------------------------------------------------

Predicate Information (identified by operation id):
---------------------------------------------------

1 - filter( EXISTS ()
2 - filter("RK"=1)
3 - filter(ROW_NUMBER() OVER ( PARTITION BY "ACCTNO" ORDER BY "SORTNO")0)

Note
- dynamic sampling used for this statement (level=2)

其中
CASE

WHEN SUM(B.ACCTFS) OVER(PARTITION BY P.ACCTNO) =

COUNT(1) OVER(PARTITION BY P.ACCTNO)

THEN P.ACCTNO

END
就是意思是:ACCTFS的值都是0,1 。就是找到账号的ACCTFS都是1的账号(一个账号有多个ACCTFS)

问题1:
其实红字部分应是 P.ACCTFS,写时候写错了,但是编译的时候为什么不报错呢???
而且在执行计划 谓词中 5 - filter 看到 B.ACCTFS 变成了 :B1,这里的:B1是什么 ???
问题2:
还是在 5 - filter 中 :=B2 是什么东西 ???sql中并没有啊 ?????

回复

使用道具 举报

千问 | 2014-2-18 16:47:53 | 显示全部楼层
:B1 ,:B2代表绑定变量
回复

使用道具 举报

千问 | 2014-2-18 16:47:53 | 显示全部楼层
我想知道是具体指哪个字段或变量
回复

使用道具 举报

千问 | 2014-2-18 16:47:53 | 显示全部楼层

1. 因为是相关子查询因此外层的B.ACCTFS是可见的,编译不报错
2. B2就是外层的B.ACCTNO, 用它来匹配内层的表达式。CBO会改写你的查询,有时候面目全非。
查询可以合并:
SELECT *
FROM ( SELECT P.*,

ROW_NUMBER() OVER(PARTITION BY ACCTNO ORDER BY SORTNO) AS RK

,SUM(CASE WHEN MINUS_ONLNBAL0 THEN P.ACCTFS END) OVER(PARTITION BY P.ACCTNO) sm

,COUNT(CASE WHEN MINUS_ONLNBAL0 THEN 1 END) OVER(PARTITION BY P.ACCTNO) cnt

FROM TEST_FDM_KNA_ORBK P

WHERE P.AS_OF_DATE = TO_DATE(20120131, 'YYYYMMDD')
)
WHERE RK = 1 AND sm=cnt
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

主题

0

回帖

4882万

积分

论坛元老

Rank: 8Rank: 8

积分
48824836
热门排行