func();
?
я в pgx (golang) пытаюсь это прочесть, он мне читает только первый селект.
Через union или через with, возможно через with recursive, если подходит по задаче.
мне придется мерджить все батчи в один запрос получается 🤔
А ты разве не это хочешь? - У тебя сейчас отдельные запросы. Отправляй отдельно и получай результат отдельно, если нужно так.
я просто криворукий у меня под этими функциями огромный инсерт и все инсерты связаны 🤔 (то есть мне бы пришлось ~ 2к отдельных вызова делать) поэтому они и в батче
Они нужны в рамках транзакции?
Тогда собери через union. Будет норм.
ок, получается батча не будет, я правильно понял? я думал батч будет быстрее потмуш препейрд стейтмент все делв
Я не понимаю что в вашей терминологии означает "батч". Выше вы привели отдельные запросы, которые выполняются по отдельности. Через union как раз все запросы можно собрать в одну пачку и выполнить как раз-таки батч, всю пачку разом.
Так, а это уже другой вопрос. Если это не разовая процедура, то нужно собрать один конкретный запрос, иначе замучаетесь мониторить потом базу с разными запросами на одну сущность. Пример выше - это дословно как оно выглядит, или есть какие-то входные данные?
есть входные данные, один из аргументов это динамический квери func(dynQuery, arg, otherArg) { execute query into someId insert smth(...) values (..., someId) return someId }
Тогда собираете три массива, распакуете через unnest и делаете select func(arg1, arg2, arg3) from unnest(...). Соответственно в запрос передаёте три параметра с этими массивами.
нет, с этим совсем нет проблем
Ну так сделайте так, если с этим проблем нет. Не думаю что есть вариант лучше, вот конкретный пример. WITH data(dynQuery, arg, otherArg) AS ( SELECT * FROM UNNEST( ARRAY['DynQuery1', 'DynQuery2'], ARRAY['arg1', 'arg2'], ARRAY['otherArg1', 'otherArg2'] ) ) SELECT func(dynQuery, arg, otherArg) FROM data Три массива биндите через параметры запроса.
Этот пример, соответственно, эквивалентен вашему: func('DynQuery1', 'arg1', 'otherArg1'); func('DynQuery2', 'arg2', 'otherArg2'); При этом у вас всегда один и тот же statement. Будет корректно работать prepared + будет удобно работать с аналитикой запросов в базу. Результаты все получите.
сорри, разобрался, окасса я библиотеку неправильно использую спасибо большое
У вас в любом случае тонна мелких запросов и вы говорите что это в рамках транзакции. Это хуже, чем мой вариант, т.к. мой вариант будет работать быстрее (один запрос vs много запросов), соответственно транзакция завершится быстрее, соответственно меньше локов в базе.
как я понял, в самом бд нет понятия батч запросов?
Верно. Батчи нужно собирать самому, по примеру выше.
🤔🤔🤔🤔 https://github.com/jackc/pgx/blob/3599f646293c1b0d381214ab26895abb9f605bc8/conn.go#L730
Ну как бы это обёртка Го, смотрите в код =) for _, bi := range b.items {
Чтобы не сомневаться - сделайте benchmark. Гошный SendBatch и мой запрос отдельный. Сравните latency.
ok, попробую, спасибо
Обсуждают сегодня