следующие запрос возвращает данные срочно:Почему postgresql не запускает сразу несколько строк?
SELECT time, value from data order by time limit 100;
Без предельного пункта, это занимает много времени, прежде чем сервер начнет возвращающуюся строку:
SELECT time, value from data order by time;
Я наблюдаю это как с помощью инструмента запросов (psql
) и при запросе с использованием API.
Вопросы/проблемы:
- Объем работы сервер должен сделать, прежде чем начать возвращать строки должны быть одинаковыми для обоих операторов выбора. Верный?
- Если да, то почему существует задержка в случае 2?
- Есть ли какая-то фундаментальная проблема РСУБД, которую я не понимаю?
- Есть ли способ, с помощью которого postgresql можно начинать возвращать строки результата клиенту без паузы, также для случая 2?
- EDIT (см. Ниже). Похоже, что
setFetchSize
- это ключ к решению этого вопроса. В моем случае я выполняю запрос из python, используя SQLAlchemy. Как установить этот параметр для одного запроса (выполняетсяsession.execute
)? Я использую драйвер psycopg2.
Столбец time
является основным ключом, кстати.
EDIT:
Я считаю, что это отрывок из JDBC driver documentation описывает проблему и намеки на решение (я все еще нуждаются в помощи - увидеть последнюю пулю элемент списка выше):
По умолчанию драйвер собирает все результаты для запроса сразу. Это может быть неудобно для больших наборов данных, поэтому драйвер JDBC предоставляет средство для базы данных ResultSet для курсора базы данных и только выборку небольшого количества строк.
и
Изменение кода в режиме курсора так просто, как установка размера выборки Заявления до соответствующего размера. Установка размера выборки на 0 приведет к кэшированию всех строк (поведение по умолчанию).
// make sure autocommit is off
conn.setAutoCommit(false);
Statement st = conn.createStatement();
// Turn use of the cursor on.
st.setFetchSize(50);
Какой драйвер вы используете? (вероятно, psycopg2, но, пожалуйста, подтвердите) –
Вы в основном помогли себе. Отлично сработано! –
Да, водитель psycopg2. – codeape