2013-04-10 390 views
4

在我們的生產環境中發生了一些性能問題後,我向我們的數據庫管理員尋求幫助。在幫助時,他們告訴我,合併鎖定表,並建議我改用UPDATE語句。合併到基於分區列的分區表時,MERGE INTO語句是否鎖定整個表?

從我讀過的所有內容來看,我的印象是MERGE INTO和UPDATE具有類似的增量鎖定模式。下面是我們的應用程序正在使用的MERGE INTO語句的一個例子。

MERGE INTO sample_merge_table smt 
USING (
    SELECT smt.*, sjt.* 
    FROM sample_merge_table smt 
    JOIN some_join_table sjt 
     ON smt.index_value = sjt.secondary_index_value 
    WHERE smt.partition_index = partitionIndex 
) umt ON (smt.partition_index = partitionIndex AND smt.index_value = umt.index_value) 
WHEN MATCHED THEN 
    UPDATE SET... 
WHEN NOT MATCHED THEN 
    INSERT VALUES... 

在運行此語句時,鎖定過程實際上會是什麼?參與USING select的每個表是否會被鎖定? sample_merge_table將被完全鎖定,還是隻有正在訪問的分區? UPDATE語句會增量鎖定,還是MERGE INTO本身已經擁有所需的鎖?

回答