作者ppanerai ( panerai_)
看板Database
标题Re: [SQL ] 不认得外层的 Table栏位名称
时间Thu Aug 24 11:15:00 2006
: UPDATE EMP_TABLE A
: set A.RECORD_NO = (
: SELECT B.REC_NO
: FROM (
: SELECT ROW_NUMBER() over
: (partition by EMP_ID order by EMP_ID) AS REC_NO,
: ROWID AS SUB_ROWID
: FROM EMP_TABLE D
: WHERE D.EMP_ID = A.EMP_ID
: ) B
: WHERE B.SUB_ROWID=A.ROWID
: )
: 没有黄色那行的限制条件,是可以顺利执行,
: 但很要命的是执行时间过长,
: 假设EMP_TABLE仅有500笔,执行时间为0.5秒;
: 10万笔的资料可能就需要约三四十万秒
: (我对BIG-O Notation 的概念模糊,错了请纠正)
: 所以才加黄色那一行来增加效率
: (ORA-00904: "A"."EMP_ID": invalid identifier........囧)
呵呵 前面误会了
顺便说明一下 ROW_NUMBER() over ... 称为 Analytic Functions
有兴趣可以番翻手册 - SQL Reference
(囧~ 我果然还是一整个浅)
SELECT B.REC_NO
FROM (
SELECT ROW_NUMBER() over
(partition by EMP_ID order by EMP_ID) AS REC_NO,
ROWID AS SUB_ROWID
FROM EMP_TABLE D
WHERE D.EMP_ID = A.EMP_ID
) B
WHERE D.EMP_ID = A.EMP_ID
我认为 这一行并不是与A同一层啊
所以本来你写的应该是没错的
而你说的效率不好
我们从 explain plan 来看以下这一句
UPDATE EMP_TABLE A
set A.RECORD_NO = (
SELECT B.REC_NO
FROM (
SELECT ROW_NUMBER() over
(partition by EMP_ID order by EMP_ID) AS REC_NO,
ROWID AS SUB_ROWID
FROM EMP_TABLE D
) B
WHERE B.SUB_ROWID=A.ROWID
)
PLAN :
Cost | Execution Plan
------------------------------------------------
1 | UPDATE STATEMENT
| UPDATE EMP_TABLE
1 | TABLE ACCESS FULL EMP_TABLE
9 | VIEW
| WINDOW SORT
1 | TABLE ACCESS FULL EMP_TABLE
因为我们要进行处理的是 整个 TABLE
所以并非有无限制条件的问题
PLAN可以做为参考
数字好看未必执行就快
重点是 不论我们今天怎麽修改这一句 所要UPDATE处理的就是整个 10万笔
所以我想应该不是你的APPLICATION的问题噜
可以po一下你 Hardware配备吗?
啊我也想问问 为什麽不使用 PL/SQL 处理呢?
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 202.145.230.2
1F:推 noguest:用个 temporary table 应该可以更快,把 O(n^2) 降成 O(2n) 08/26 16:26