本人菜鳥第一次提問,可能問題描述會不太清楚,請各位大牛諒解。 PL/SQL運行如下代碼,要求是根據欄位CC下同一字串進行編碼,29.5萬條資料,第一次跑了30分鐘我停止了,第二次跑了70多分鐘還沒結束還是停止了 后面PL/SQL就報ora03113 通信通道的檔案結束,說是歸檔日志已經滿了。按照網上的教程給修改了,但我還是想弄清楚這條陳述句到底有什么問題。
update LCA_編碼 t set t.dlbh=(select a.BH from (select objectid,row_number() over(partition by CC order by CC) as BH from LCA_編碼) a where a.objectid=t.objectid)
uj5u.com熱心網友回復:
你的具體需求是什么,描述清楚一些~另外,如果是本地資料庫的話,建議關閉歸檔模式,方式如下:
SQL> shutdown immediate;
Database closed.
Database dismounted.
ORACLE instance shut down.
SQL> startup mount;
ORACLE instance started.
Total System Global Area 3423965184 bytes
Fixed Size 2180544 bytes
Variable Size 2013268544 bytes
Database Buffers 1392508928 bytes
Redo Buffers 16007168 bytes
Database mounted.
SQL> alter database noarchivelog;
Database altered.
SQL> archive log list;
Database log mode No Archive Mode
Automatic archival Disabled
Archive destination USE_DB_RECOVERY_FILE_DEST
Oldest online log sequence 228
Current log sequence 230
SQL>
uj5u.com熱心網友回復:
把這個子查詢的資料,先寫進一張表試試;uj5u.com熱心網友回復:
TLBH為nvarchar(255),根據CC的型別編碼排序 用的是OVER(partion by order by),PL/SQL60多條記錄很快就運行完了,但是運行29.5萬條記錄,PL/SQL運行了70多分鐘還沒有結束。之前做過對27.5萬條記錄的表格的CC欄位賦空處理,oracle只要27S,同樣用python要1分2S,而python同樣處理29.5W條資料才1分7S,我覺得oracle性能應該比python優越,不知道出什么情況一直運行不停止。我這樣您能看明白么CC TLBH
SS 00001
SS 00002
AA 00001
AA 00002
BB 00001
BB 00002
BB 00003
uj5u.com熱心網友回復:
如果少數幾條資料速度很快,而資料量一大則會變得例外慢,就要考慮一下你的SQL陳述句是不是對了打個比方說是不是有可能在子查詢中形成了卡笛爾積,導致資料量成幾十倍的增加
歸檔日志的話,要是你確認庫沒問題一個你可以關閉歸檔,一個可以將日志備份到別的地方
uj5u.com熱心網友回復:
為什么要UPDATE,直接CREATE TABLE AS 然后把老表干掉,新表重命名不就可以了uj5u.com熱心網友回復:
objectid有索引沒,可以嘗試在這列上建索引。uj5u.com熱心網友回復:
有考慮這是笛卡爾積的問題,但具體機制希望一個大牛來解釋一下。create table的話會另外生產一個新表,我嘗試過merge into,但不符合我的本意,這只是其中一個小功能,如果能原表更新最好了,我是關聯幾個欄位批量更新uj5u.com熱心網友回復:
那你就按版主的辦法 ,uj5u.com熱心網友回復:
What does the execution plan say?uj5u.com熱心網友回復:
objectid換成rowid試試,不過效果估計不會太明顯,全表更新并且時間都耗在了編號bh的生成上了。uj5u.com熱心網友回復:
弄個程序, select a.BH from (select objectid,row_number() over(partition by CC order by CC) as BH from LCA_編碼把這個sql的結果一條一條的 update就行了。
29萬資料開窗排序也需要個3,4秒的樣子吧, 你每條記錄搞一次, oracle怎么受得了。
uj5u.com熱心網友回復:
這個陳述句放在SQLserver里面跑 29.5W條記錄 2秒就全部更新了 是Oracle和SQLserver機制的問題么 還是說我寫的陳述句在PLSQL里面不行轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/117788.html
標籤:開發
