Перенос вычисления с маршрутизатора на шард может ускорить SQL-запрос. Но с
nextval() такая оптимизация способна изменить результат.В разборе планировщика Neki показаны две сложности. Во-первых, независимые последовательности на шардах могут выдать одинаковые значения. Поэтому маршрутизатор получает новые номера через выделенный авторитетный шард.
Во-вторых, важно число вызовов. Если
JOIN превратил одну исходную строку в три строки результата, выражение nextval() в списке SELECT должно получить новое значение для каждой из них. Вычислить его один раз до соединения и размножить ответ нельзя.Похожее ограничение касается
now(): в PostgreSQL оно связано с началом транзакции. Независимый вызов на каждом шарде может вернуть разные моменты времени.При распределении SQL по узлам приходится сохранять место, контекст и число вычислений выражения.
#postgresql #архитектура
