Re: [SQL ] 不認得外層的 Table欄位名稱

看板Database (資料庫)作者 ( panerai_)時間18年前 (2006/08/24 10:57), 編輯推噓1(100)
留言1則, 1人參與, 最新討論串4/4 (看更多)
: 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
用個 temporary table 應該可以更快,把 O(n^2) 降成 O(2n)
08/26 16:26, 1F
文章代碼(AID): #14xHM12F (Database)
文章代碼(AID): #14xHM12F (Database)