Выполнение следующего кода в большой таблице PostgreSQL, объект NpgsqlDataReader блокирует пока все данные не будут извлечены.Как остановить NpgsqlDataReader от блокировки?
NpgsqlCommand cmd = new NpgsqlCommand(strQuery, _conn);
NpgsqlDataReader reader = cmd.ExecuteReader(); // <-- takes 30 seconds
Как я могу заставить его вести себя так, чтобы он не предварительно отбирал все данные? Я хочу выполнить набор результатов по строкам, не забрав сразу все 15 ГБ в память.
Я знаю, что были проблемы с такого рода вещами в Npgsql 1.x, но я на 2.0. Это противоречит базе данных PostgreSQL 8.3 на XP/Vista/7. У меня также нет фанки «force Npgsql для предварительной выборки» в моей строке подключения. Я совершенно не понимаю, почему это происходит.
Я бы поднял голову, но у меня пока нет репутации. Мой план резервного копирования заключается в том, чтобы объявить курсор вручную, как вы предлагаете. В идеале я хотел бы, чтобы DataReader «просто работал». :) Разве не все дело в DataReader, что это быстрый способ прямого доступа к данным? Поэтому это поведение кажется мне странным. –
@Swingline Rage: возможно, что драйвер .net просто менее зрелый, чем даже драйвер JDBC. Полагаю, что протокол postgresql имеет механизм для получения результатов любого запроса с помощью курсора (команды SQL - это отдельный интерфейс более высокого уровня). Может быть, Npgsql просто не имел поддержки для использования этого написанного? Istr, что традиционный вызов PQexecutequery() на самом деле просто возвращает весь результат за один раз и, по-видимому, пытается оставить это в буфере ОС и обработать его peicemeal будет плохо ... – araqnid
Да, хороший момент (и несколько удручающий). Я рассмотрю это более подробно. Я продолжаю забывать, что Npgsql является открытым исходным кодом, поэтому ответы есть. Но в последний раз, когда я смотрел, я обнаружил, что код трудно следовать, как всегда, с внутренними данными. –