2011-08-08 91 views
1

這個問題適用於寫在SQL-92
也就是Oracle的PL/SQL存儲過程,SQL Server的T-SQL或DB2 SQL冗長的SQL存儲過程中存儲越來越多列

我維持11000行存儲過程。
我發現在存儲過程結束時,我需要報告80列數據。

在此存儲過程中有3個不同的階段。

  1. 數據收集(複製從實時表中的數據到存儲過程中間表)
    我需要做數據收集的一致性,因爲實況數據(即,在部件表)在管線30可以由已經改變時間在存儲過程執行得排隊萬
    提交狀態原子在這裏維持(沒有提交,直到被複制所需的所有數據)
  2. 計算(很多SQL的,足夠複雜,使光標或意見不會做工作)
  3. 回寫到永久表(發票,AR,付款)
    提交狀態的原子在此保持(沒有提交,直到所有需要的數據被複制)

「中間」表僅在存儲過程中使用。
他們被編入索引的加入下了線,但沒有
PK/FK參照完整性約束或唯一索引
,因爲這些會執行除了大幅放緩
到指回實時數據(即通量)

當你到數據的80列,你需要通過一個存儲
過程中,您對RDBMS限制(指標限制,內存限制跑起來,
SQL月底上報加入開銷的限制,失控的分頁和數據將虛擬到
當DB認爲它應該使用,而不是使用嵌套循環)

HASH內存/交換我已恢復正常的實時數據(即得到由數據錄入用戶寫入和讀取從24/7)

它發生在我優化存儲過程(在步驟2)中使用的中間表所佔用的空間的方式將是找到複合主鍵並且分配每個唯一的id(代理PK),從而參考n個具有1的列柱。然後,我將在步驟2結束時重構此數據,並準備好將其寫回到步驟3開始時的
。這會將更多處理添加到步驟2中的
,但較少的數據將被複制。此外調試將採取
更多步驟(中間
表數據追溯ID,以實際的數據執行完成後)

有沒有人遇到這種情況與冗長的存儲過程?
是否有人在
中僅在存儲過程中使用的中間表中創建了替代鍵(用一列PK替換化合物PK)?

在執行過程中執行時間和內存/空間使用情況是否已經完成?

+0

你是說11千行存儲過程嗎? – n8wrl

+0

每次執行sproc時:您正在創建臨時表的數據量的大小是多少?直覺上,一個11000行的sproc聽起來像是一個錯誤的方法。您可以編寫一個C#應用程序,在計算過程中將需要的數據交給內存嗎? –

+0

@Simen S它實際上使數據庫大小加倍。如果存儲過程已經在SQL中處理非常複雜的數據處理(處理數據塊),則逐行處理並不是一種選擇 –

回答

2

我已經建立了幾個lenghty存儲過程和我一直走了一個恆等式列代理鍵。是否有可能重新考慮正在做什麼,併爲每個中間步驟創建單獨的臨時表?我不得不在過去這樣做。最後,我「拼接」所有單獨的臨時表到我的最終輸出。

+0

對,這正是我想要做的。在SQL Server中,它是Identity列,在Oracle中是SEQUENCE,在DB2中,它是IBM DB2中的DEFAULT的AS IDENTITY GENERATED GENERATED。 –

2

而且我認爲我的1400線procs很長!

我可以看到代理鍵在聯接中比組合PK更快。但有了這些複雜的東西,我認爲你只需要嘗試兩種方式。

你可以減少80列嗎?我猜我在問你是否使用select *來加入連接,這些連接在查詢中會被重複並且可以被忽略。

+0

顯然沒有任何重複的多場聯接。真正需要解決的是我需要找到/構建一個工具,將SQL連接標準回溯到先前的選擇項目並提出代理主鍵。 –

+0

我只能說,這似乎是一個合理的嘗試,但你必須仔細衡量,看看是否有真正的性能差異。 – HLGEM

1

爲什麼不嘗試編寫SSIS包。除寫入臨時表外,大部分計算都將在SSIS內存中,而不會打擾數據庫。

您可以根據需要將您的包分解爲多個部分,並且過程更易於維護。

順便說一句,11K存儲過程是瘋了......有什麼辦法呢,不得不說:-)

+0

我沒想過SSIS。 SSIS是用於ETL操作等,並將存儲過程轉換爲SSIS包將成爲維護的噩夢。 –

+0

我知道11K聲明式SQL是瘋了,但替代方案(22K,33K--在這裏選擇你的命令式語言)更瘋狂。命令式語言逐行處理數據,無法在流程中調試數據。如果最終結果有問題,我需要查看剩餘的中間表數據。我已經完成了帶有嵌入式DB2 SQL調用的Pro * C,C#,C等,它們不會削減它。 –

0

「我需要的一致性進行數據採集,因爲實時數據(即在會員表),在第30行可能是由存儲過程執行得排隊10,000時間已經改變」

在Oracle中你可以請查看DBMS_FLASHBACK(或SERIALIZABLE隔離級別)以獲得此級別的一致性。閃回查詢可能會避免您需要複製所有數據。

我爲數據遷移做了類似的練習 - 很多臨時表。需要檢查的一個因素是統計信息會在臨時表的適當時間點收集。如果這些表通常是空的,那麼統計數據可能會在最後搞砸了。