這個問題適用於寫在SQL-92
也就是Oracle的PL/SQL存儲過程,SQL Server的T-SQL或DB2 SQL冗長的SQL存儲過程中存儲越來越多列
我維持11000行存儲過程。
我發現在存儲過程結束時,我需要報告80列數據。
在此存儲過程中有3個不同的階段。
- 數據收集(複製從實時表中的數據到存儲過程中間表)
我需要做數據收集的一致性,因爲實況數據(即,在部件表)在管線30可以由已經改變時間在存儲過程執行得排隊萬
提交狀態原子在這裏維持(沒有提交,直到被複制所需的所有數據) - 計算(很多SQL的,足夠複雜,使光標或意見不會做工作)
- 回寫到永久表(發票,AR,付款)
提交狀態的原子在此保持(沒有提交,直到所有需要的數據被複制)
「中間」表僅在存儲過程中使用。
他們被編入索引的加入下了線,但沒有
PK/FK參照完整性約束或唯一索引
,因爲這些會執行除了大幅放緩
到指回實時數據(即通量)
當你到數據的80列,你需要通過一個存儲
過程中,您對RDBMS限制(指標限制,內存限制跑起來,
SQL月底上報加入開銷的限制,失控的分頁和數據將虛擬到
當DB認爲它應該使用,而不是使用嵌套循環)
HASH內存/交換我已恢復正常的實時數據(即得到由數據錄入用戶寫入和讀取從24/7)
它發生在我優化存儲過程(在步驟2)中使用的中間表所佔用的空間的方式將是找到複合主鍵並且分配每個唯一的id(代理PK),從而參考n個具有1的列柱。然後,我將在步驟2結束時重構此數據,並準備好將其寫回到步驟3開始時的
。這會將更多處理添加到步驟2中的
,但較少的數據將被複制。此外調試將採取
更多步驟(中間
表數據追溯ID,以實際的數據執行完成後)
有沒有人遇到這種情況與冗長的存儲過程?
是否有人在
中僅在存儲過程中使用的中間表中創建了替代鍵(用一列PK替換化合物PK)?
在執行過程中執行時間和內存/空間使用情況是否已經完成?
你是說11千行存儲過程嗎? – n8wrl
每次執行sproc時:您正在創建臨時表的數據量的大小是多少?直覺上,一個11000行的sproc聽起來像是一個錯誤的方法。您可以編寫一個C#應用程序,在計算過程中將需要的數據交給內存嗎? –
@Simen S它實際上使數據庫大小加倍。如果存儲過程已經在SQL中處理非常複雜的數據處理(處理數據塊),則逐行處理並不是一種選擇 –