2010-01-31 61 views
2

每當我插入一些東西時,表格是否被鎖定?因爲我想每秒插入數千行,所以我想知道是否有多個線程可以有效地幫助插入。如果每個插入操作鎖定表,則只有一個線程幾乎與10個線程一樣高效。 如果它依賴於數據庫引擎,我使用SQL Server 2008.什麼時候數據庫表被鎖定?

回答

4

VoidPointer不一定是正確的。他也不一定是不正確的。這取決於你爲什麼有一個多線程應用程序。如果線程純粹被設計爲一種「插入更多數據」的機制,那麼它就不會提高性能。但是如果線程有其他用途,那麼它表明你的延遲可能是系統中的其他地方,你不應該擔心太多的數據庫。你爲什麼得到所有這些線程?大概你試圖讓其他一些操作更高效 - 比如多個I/O綁定調用,它們以未知的時間間隔完成,但將整體延遲降低到最長運行線程的長度?如果沒有更多關於你想要實現的內容以及爲什麼,你不能簡單地宣稱多線程解決方案是錯誤的。

看一看some of the locking hint options SQL Server supports ..

認爲 SQL Server支持併發插入

+0

說得好。除非唯一的目的是加速插入,否則沒有理由認爲多線程在此時不會有幫助。 – 2010-02-01 00:10:23

+0

好點。我以某種方式假定線程完成的工作不是瓶頸。情況很可能如此。 – VoidPointer 2010-02-01 08:00:49

3

鑑於數據庫是'瓶頸',而不是線程正在做的工作,使得來自不同線程的所有插入(使用單獨連接)將不利於你的表現。特別是如果你每次插入一個新的事務。每次提交事務時,數據庫都需要工作以確保數據完整性得到維護。這是非常糟糕的,因爲所有的交易都會競爭對同一個對象進行更改。

而不是使用多個線程插入您應該確保您在一個單一事務中執行所有操作,並且只在所有插入完成時才提交。

BEGIN TRANSACTION; 
INSERT INTO myTable (Col1, Col2) 'First' ,1; 
INSERT INTO myTable (Col1, Col2) 'Second' ,2; 
... 
COMMIT; 

N.B. - 還可以做所有的刀片在一個stament但這並不有所作爲性能方面:

INSERT INTO myTable (Col1, Col2) 
    SELECT 'First' ,1 
    UNION ALL 
    SELECT 'Second' ,2 
    UNION ALL 
    SELECT 'Third' ,3; 

在一個事務進行分組我看來多個刀片是要簡單得多。另外,第二個版本可能會產生一個嵌套的語句,對於數據庫來說處理起來太過分了。