Re: [SQL ] 不認得外層的 Table欄位名稱
: 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
推
08/26 16:26, , 1F
08/26 16:26, 1F
討論串 (同標題文章)
本文引述了以下文章的的內容:
完整討論串 (本文為第 4 之 4 篇):
Database 近期熱門文章
PTT數位生活區 即時熱門文章
-4
30