не жалуется, тормозит с выполнением
а вообще это нормальная практика использования служебных полей в запросе? ну и формы ANY(ARRAY()) вместо in?
Вообще-то нет, не нормальная. Как и сборки их в массив из запроса, в большинстве случаев. А ANY(ARRAY()) для константного списка (передаваемого как параметр с клиента, например) — норма. Т.е. смотря в какой ситуации. Тут, похоже, кто-то что-то оптимизировал (пытался устранить deadlocks, возможно).
Как-то непойму -- а зачем тут ANY(ARRAY()) нужэн? Ну, будет сначала оно в указанном порядке FOR UPDATE, а потом только UPDATE, или в указанном порядке будет идти на каждую строку попарно FOR UPDATE, UPDATE -- какая разница? Блокировка вроде одна и та жэ в итоге.
Видимо, там есть какие-то другие UPDATE, с которыми это и "синхронизируется" таким образом. В сторону: почему в своих рассуждениях о блокировках и корректности многие часто рассматривают только взаимодействие разрабатываемого UPDATE (или транзакции) только с другой такой же? Других запросов к этой таблице не существует, что ли ("таблица одного запроса")? ;) > Блокировка вроде одна и та жэ в итоге. Последовательность блокировок может быть разная — ORDER BY-то прямо в UPDATE не напишешь.
Да какбы -- другие/не другие... По-моему, оно будет иметь одинаковую последовательность блокировок, определяемую ORDER BY в IN (SELECT ... ORDER BY FOR UPDATE) и ANY(ARRAY(SELECT ... ORDER BY FOR UPDATE).
А, в этом смысле. Ну да, с ctid-ами отличие только в том, что это (возможно) быстрее.
Не-не, я вообще сейчас не про ctid. ctid -- это отдельно Я про ctid IN (SELECT ...) vs ctid = ANY(ARRAY(SELECT ...)) Тут ужэ упоминали, что это странная конструкцыя. Она в общем в большынстве случае заметно замедлит всё это развлечение (часто промежуточный результат можно просто не хранить). Я думал -- можэт вы обратили внимание, и имеете в виду, что этот кунштюк можэт как-то повлиять на блокировки и deadlock avoidance.
Да нет, хотя планы так получаются формально разные, эффективность у них примерно одинакова, если rows мало. Если много — замедлит, по идее (я как-то не пользовался).
Ну, тут примерно 700 тысяч, надо думать. Кроме того, так он, возможно, сможэт это в один проход по буферам t1 отработать.
Вообще неизвестно, сколько там в t2 на самом деле, то-то и оно.
Эстиматор говорит, что 685546. Для временных таблиц он вроде нормально эту статистику online обновляет.
Как раз нет, для temporary tables "сама по себе" статистика не обновляется никогда, и рассчитывается очень криво, особенно в нетривиальных случаях.
Обсуждают сегодня