Производительность на обновлениях с использованием курсора в PostgreSQL
-
16-10-2019 - |
Вопрос
Я хотел бы знать разницу в производительности в обновлении таблицы, используя следующий метод:
UPDATE films SET kind = 'Dramatic' WHERE CURRENT OF c_films;
или как это:
UPDATE films SET kind = 'Dramatic' WHERE unique_indexed_int_column = 3000;
Кто -нибудь проверял это или знает, как работают обновления, использующие курсоры, чтобы они могли прокомментировать это?
РЕДАКТИРОВАТЬ: Я теперь оценил это и обнаружил, что это фактически примерно на треть быстрее, чтобы сделать последний пример. Я запустил каждый из запросов 100000 раз и рассчитывал разницу. Я использовал psycopg2, используя курсоры на стороне сервера для связи с Postgres. Я буду исследовать далее, чтобы узнать, могу ли я найти, что это не всегда так.
Решение
Я не знаком с PostgreSQL, поэтому я могу дать вам только общий ответ.
Во -первых, если indexed_int_column
не уникален, второй оператор будет обновлять несколько строк, тогда как первый будет обновлять строку в настоящее время под курсором c_films
. Анкет Таким образом, утверждения не идентичны.
Предполагая уникальность и курсор C_FILMS, находясь в одной ряду, где indexed_int_column = 3000
, Затем обновление должно быть очень быстро, когда курсор будет расположен под определенной строкой, так как курсор удерживает информацию, чтобы напрямую доступ к физическому местоположению этой строки. Второе утверждение, однако, будет сначала принести индекс, поиск значения 3000 в нем, и только тогда он будет знать физическое местоположение строки для обновления. Тем не менее, эта операция по поиску должна была быть сделана для курсора в какой -то момент (если мы не перечислили по всей таблице). Таким образом, в целом он окупается только для использования курсора, когда вам в любом случае нужно сначала прочитать данные, а затем вы хотите обновить ту же строку, которую вы только что прочитали.