PDO :: fetch работает медленно при возврате идентификаторов из оператора INSERT - PullRequest
1 голос
/ 02 марта 2020

Я использую PHP версии 7+ (пробовал на 7.0, 7.1,7.2) и PostgreSQL версии 11 (пробовал также на версии 10). И у меня возникают проблемы с методами PDO :: fetch (или fetchAll) при выполнении запроса SQL, например:

INSERT INTO test_product_table (name, default_image_id, created_at)
VALUES (:p1, :p2, :p3),(:p4, :p5, :p6),(:p7, :p8, :p9)
RETURNING id

с базовым кодом c PHP, например:

/** @var string $sql - query above **/
/** @var array $params - parameters **/
/** @var PDO $databaseConnection - PostgreSQL PDO connection**/


$res = $databaseConnection->prepare($sql);
$res->execute($params);

$res->fetchAll(); //or $res->fetch() in loop

Не думаю, что это действительно имеет значение, но есть тестовая таблица DDL:

create table test_product_table
(
    id               serial                   not null
        constraint test_product_table_pkey
            primary key,
    name             text                     not null,
    default_image_id integer,
    created_at       timestamp with time zone not null
);

Мне нужно вставить много данных (например, тысячи строк и более) и затем извлеките вставленные идентификаторы и назначьте их объектам в PHP. Но время, затрачиваемое на получение, крайне. Я попытался сделать это без параметров - используя метод кавычек - и запрос был быстрым, но я действительно не хочу делать сверхдлинный строковый запрос с кавычками параметров. Но для 5000 строк потребовалось, например, 900 мс с запросом параметра и 150 мс с запросом в кавычках.

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

Может кто-нибудь объяснить мне, почему выборка такая медленная при использовании параметров вместо кавычек? И есть ли обходной путь?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...