2015-07-21 95 views
0

我正在使用第三方ETL應用程序(Pentaho/Kettle/Spoon)---很遺憾,我不確定確切的SQL查詢,但我可以嘗試不同的手動查詢。MySQL vs MS SQL Server - 並行進程插入/更新

我只是想知道爲什麼... MySQL似乎允許多個進程一次做一個插入,但如果找到,更新...查詢。

MS SQL不會......當一個查詢正在執行插入/更新時,它會「鎖定」行;如果另一個查詢嘗試插入/更新同一數據,則會引發錯誤。

我想這是有道理的......但我只是有點煩惱,MySQL允許這一點,而MS SQL不會。

有什麼辦法可以解決這個問題嗎?

我只想盡可能快地將1000條記錄列表插入/更新到數據表中。在過去,我只是將這些數字分成20個進程,更新50個記錄進行插入/更新...這個並行工作,因爲1000個記錄都沒有重複...他們只是它們已經在表中的一些重複...所以只要它發生,它們可以按任何順序插入/更新。

有什麼想法?謝謝

+0

編輯:它也許與添加有關,只有約2-5%的數據通常是更新;絕大多數是插入。 – user45867

回答

1

MySQL默認使用ISAM存儲引擎,它不支持事務。 SQL Server是一個RDBMS,並且支持事務處理,雖然你可以調整隔離級別來做冒險的事情,比如read uncommitted(很少是一個好主意)。

如果您希望MySQL數據庫具有事務支持,則需要使用ENGINE = INNODB選項顯式創建表。舊版本也支持引擎= BDB這是伯克利數據庫引擎。查看MySQL文檔InnoDB上的更多詳細信息 http://dev.mysql.com/doc/refman/5.7/en/innodb-storage-engine.html

+0

我想你誤會了。我希望MS SQL能夠複製MySQL的(顯然有風險的)行爲。我想要列表A,然後儘可能快地更新表B。這意味着有多個並行進程立即更新表B.我可以補充說,風險是什麼?鑑於列表A中沒有重複的更新密鑰?只有一個最終的表B可能發生。我希望該結果以儘可能快的速度發生。 MySQL愉快地遵守。 MS SQL不會因爲整個表在一個進程開始更新時被鎖定。那麼,我該如何做到這一點?謝謝。 – user45867

+0

我不確定你的意思是通過閱讀未提交...隱約,我認爲...我不需要'新插入/更新'行被讀取或分析...再次,列表A是完全獨特的...可以安全地說,列表A中的任何「新行」或更新都可以被列表A的「其餘」忽略。我是否需要將鎖定級別從「鎖定表格」設置爲「鎖定行只是'不知何故? – user45867

+0

默認情況下,寫入將在MS SQL Server中阻塞(讀提交隔離級別)。您可以將其更改爲未提交讀取,這允許與MySQL的默認行爲類似的行爲。插入或更新無關緊要,事務未提交的活動寫入行默認不能讀取。您的原始帖子在第3段中明確要求。如果你想要的是快速插入,請在網上查找書本中的批量插入。儘管您可能有其他資源爭用,多個插入連接也可以正常工作。將更新/讀取混合到同一行將始終阻止 – SQLmojoe