2011-01-21 2 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

+0

Это не удивительно, но, возможно, хорошо сформулируйте мой ответ. Единственный случай, когда обновление курсором делает ощущение, когда вы хотите прочитать дату, которую вы обновляете в первую очередь. В любом другом сценарии, очевидно, чтение, а затем обновление происходит не быстрее, чем обычно, медленнее (тем более, что между db и программой есть дополнительная связь), чем обновление напрямую. (Если бы это было не так, БД была бы глупо не всегда читать и писать потом в таком случае, чтобы получить производительность ...) –

Смежные вопросы