Производительность обновлений с использованием курсора в PostgreSQL - PullRequest
0 голосов
/ 22 января 2011

Хотелось бы узнать разницу в производительности при обновлении таблицы следующим способом:

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 Ответ

1 голос
/ 22 января 2011

Я не знаком с PostgreSQL, поэтому могу дать вам только общий ответ.

Во-первых, если indexed_int_column не является уникальным, второй оператор обновит несколько строк, тогда как первый будет обновлять только строку, находящуюся под курсором c_films. Так что утверждения не идентичны.

Если предположить, что уникальность и курсор c_films находятся в одной строке, где indexed_int_column = 3000, тогда обновление должно быть очень быстрым, когда курсор находится под определенной строкой, поскольку курсор содержит информацию для прямого доступа к физическому расположению этой строки , Второе утверждение, однако, должно будет сначала извлечь индекс, найти в нем значение 3000, и только тогда оно будет знать физическое местоположение строки, которую нужно обновить. Тем не менее, эта операция поиска должна была быть выполнена для курсора в одной точке (если мы не выполняли итерацию по всей таблице). Таким образом, использование курсора в целом оправдывает себя только тогда, когда вам сначала нужно прочитать данные, а затем обновить ту же строку, которую вы только что прочитали.

...