Когда планируется (ВЫБРАТЬ) запросы?

Когда в PostgreSQL планируются (SELECT) запросы?

Это:

во время подготовки заявления илив начале обработки SELECT, иличто-то другое

Причина, по которой я спрашиваю, состоит в том, что существует вопрос Stackoverflow:один и тот же запрос, два разных способа, совершенно разная производительность

Многие люди думают, что запрос спланирован по-другому, потому что в одном случае запрос содержит строковый литерал ('foo') и в другом случае это заполнитель (?).

Теперь я думаю, что это красная сельдь, потому что запрос не запланирован во время подготовки оператора, а фактически запланирован во время SELECT.

Так, скажем, я мог бы подготовить оператор с заполнителем, затем выполнить запрос несколько раз с различными связанными значениями, и планировщик запросов будет выполняться для каждого другого связанного значения.

Я подозреваю, чтовопрос, связанный выше сводится к типу данных PostgreSQL значения, которое в случае'foo' Известно, что литерал является строкой, но в случае заполнителя тип не может быть предсказан, поэтому он поступает в планировщик запросов как некий странный тип, для которого он не может создать эффективный план. В этом случае проблема не в том, что запрос планируется по-другому, потому что значение является заполнителем (во время подготовки оператора)как таковой но что значение поступает в запрос как другой тип PostgreSQL, иэто это то, что влияет на планировщик запросов. Чтобы это исправить, нужно просто связать заполнитель с соответствующим явным объявлением типа.

Ответы на вопрос(1)

Ваш ответ на вопрос