Когда планируется (ВЫБРАТЬ) запросы?
Когда в PostgreSQL планируются (SELECT) запросы?
Это:
во время подготовки заявления илив начале обработки SELECT, иличто-то другоеПричина, по которой я спрашиваю, состоит в том, что существует вопрос Stackoverflow:один и тот же запрос, два разных способа, совершенно разная производительность
Многие люди думают, что запрос спланирован по-другому, потому что в одном случае запрос содержит строковый литерал ('foo'
) и в другом случае это заполнитель (?
).
Теперь я думаю, что это красная сельдь, потому что запрос не запланирован во время подготовки оператора, а фактически запланирован во время SELECT.
Так, скажем, я мог бы подготовить оператор с заполнителем, затем выполнить запрос несколько раз с различными связанными значениями, и планировщик запросов будет выполняться для каждого другого связанного значения.
Я подозреваю, чтовопрос, связанный выше сводится к типу данных PostgreSQL значения, которое в случае'foo'
Известно, что литерал является строкой, но в случае заполнителя тип не может быть предсказан, поэтому он поступает в планировщик запросов как некий странный тип, для которого он не может создать эффективный план. В этом случае проблема не в том, что запрос планируется по-другому, потому что значение является заполнителем (во время подготовки оператора)как таковой но что значение поступает в запрос как другой тип PostgreSQL, иэто это то, что влияет на планировщик запросов. Чтобы это исправить, нужно просто связать заполнитель с соответствующим явным объявлением типа.