2011-01-21 49 views
0

使用遊標更新我想知道在使用下面的方法更新表的性能差異:性能上的PostgreSQL

UPDATE films SET kind = 'Dramatic' WHERE CURRENT OF c_films; 

或像這樣:

UPDATE films SET kind = 'Dramatic' WHERE unique_indexed_int_column = 3000; 

有沒有人測試了這個或知道如何使用遊標更新工作,以便他們可以對此發表評論?

編輯:我現在已經對此進行了基準測試,並發現它實際上比最新示例快三分之一。我將每個查詢運行了100000次,並計時了差異。我使用psycopg2使用服務器端遊標與Postgres進行通信。我會進一步調查,看我是否能夠發現情況並非總是如此。

回答

1

我不熟悉PostgreSQL,所以我只能給你一個通用的答案。

首先,如果indexed_int_column不是唯一的,第二條語句將更新多行,而第一條語句只會更新當前在光標c_films下的行。所以這些陳述並不完全相同。

假設唯一性和遊標c_films位於indexed_int_column = 3000的一行,那麼一旦光標位於特定行下,更新應該非常快,因爲光標擁有信息以直接訪問此行的物理位置。然而,第二條語句必須首先獲取索引,然後查找其中的值3000,然後才能知道要更新的行的物理位置。也就是說,這個查找操作必須在光標的某一點完成(如果我們沒有遍歷整個表)。所以一般情況下,只需要首先讀取數據,然後再更新剛剛讀取的同一行,就可以使用遊標。

+0

請參閱這兩個之間令人驚訝的基準:http://stackoverflow.com/questions/4776127/postgres-surprising-performance-on-updates-using-cursor – David 2011-01-23 20:44:34