2009-11-12 104 views
1

我有一個長期運行的工作。要處理的記錄在一個包含100K記錄的表格中。查詢性能幫助

現在,在整個工作中,只要查詢此表,就會查詢這些100K記錄。 每個記錄的處理狀態是根據同一個表更新的。

我想知道,如果我添加另一個表可以更新記錄狀態,並在此表中保持刪除處理的任何記錄,那麼會更好,以便查詢繼續前進。主表中記錄的數量會減少,提高查詢性能。

編輯:主表基本上只用於此加載。我收到一個平面文件,我將其上傳到處理之前。在對此表進行驗證之後,我一次選擇一條記錄,並將數據移動到適當的系統表。

+1

沒有更大的系統上下文很難回答 - 取決於該表的用途和方式。 – 2009-11-12 19:20:41

+0

請看我上面的意見 – 2009-11-12 19:33:29

回答

3

我有一個類似的性能問題,其中一個表通常有幾百萬行,但我只需要處理自從我上次執行開始以來發生了什麼變化。在我的目標表中,我有一個IDENTITY列,所以當我的批處理過程開始時,我從選擇的集合中得到最高的IDENTITY值,其中ID大於我先前的批處理執行。然後,在成功完成批處理作業後,我將一條記錄添加到單獨的表中,指出已成功處理的最高值IDENTITY,並將其用作下一批處理調用的起始輸入。 (我還會補充說,我的書籤表是通用的,所以我有多個不同的作業,每個作業都使用唯一的作業名稱。)

如果您遇到鎖定問題,因爲每個記錄的處理時間需要很長時間使用我上面使用的方法,但是將你的集合分成1,000行(或者你的系統可以及時處理的任何行塊大小),所以你只能在任何給定的時間鎖定較小的集合。

1

幾個指針(我的兩分錢):

考慮分拆類似「漸變維度」技術引入一些「中間」表,這取決於「系統表」目的地表;然後批量加載您的系統表 - 而不是按記錄記錄。

降「輸入」表之前批量加載,並重新創建擺脫指標等

加載之前不分配表上的不必要的(鍵)的索引。

考慮將DB「恢復模式」切換到批量加載模式,而不是記錄批量事務。

您可以使用SSIS(ETL)任務進行加載,清理和驗證嗎?

UPDATE:
這裏是一個典型的ETL場景 - 好,取決於你要向誰傾訴。

提取flat_file_1(你有)
Cleanflat_file_1 --> SSIS --> flat_file_2(你可以在這裏驗證)
符合flat_file_2 --> SSIS --> flat_file_3(適用於所有公司標準)
送達flat_file_3 --> SSIS (bulk) --> db.ETL.StagingTables(幾個,每個目的地一個)
4Binsert into destination_table select * from db.ETL.StagingTable(批量加載您的最終目的地)

這樣,如果一個進程(1-4)超時,您總是可以從中間文件啓動。您還可以檢查每個階段並從SSIS爲每個階段創建報告文件以控制數據質量。操作1-3基本上很慢;這裏他們發生在數據庫之外,可以在單獨的服務器上完成。如果您存檔flat_file(1-3),您還可以對發生的事情進行審計跟蹤 - 也適用於調試。 :)

+0

我不能做批量加載,因爲每個記錄的基礎上會有很多驗證。 我目前系統的恢復模式是「簡單」。批量裝載?你的意思是簡單嗎? 對於運行SQL Proc,SSIS工具是否具有任何性能優勢? – 2009-11-12 20:31:11

+0

數據庫屬性/選項:完整,批量加載和簡單 - 但可能取決於標準版/企業版。我們希望SSIS能夠在SSIS中做到儘可能多的工作,然後從那裏加載「中間」表格;並使用SQL「insert into ...」將數據從「中間」表移動到系統表。將中間表保存在同一個數據庫中,但使用單獨的模式(如ETL模式)是一種好的做法。 – 2009-11-12 20:44:51