Попробуйте отключить автоматическую фиксацию:
// make sure autocommit is off
connection.setAutoCommit(false);
st = connection.createStatement();
st.setFetchSize(1000);
System.out.println("start query ");
rs = st.executeQuery(queryString);
System.out.println("done query");
Два запроса имеют совершенно разные вещи.
Использование предложения LIMIT
ограничивает размер результирующего набора равным 10000, а при установке размера выборки нет, вместо этого он дает подсказку драйверу указав, сколько строк будет выбрано за раз при повторении через результирующий набор - который включает все строки 800k.
Таким образом, при использовании setFetchSize
база данных создает полный набор результатов, поэтому он занимает очень много времени.
Редактирование для ясности: установка размера выборки ничего не делает, если вы не выполните итерацию результат (см. комментарий Джона), но создание намного меньшего набора результатов через LIMIT имеет большое значение.
Это будет зависеть от вашего драйвера. Из документов:
Дает драйверу JDBC подсказку о количестве строк, которые должны быть извлечены из базы данных, когда требуется больше строк. Количество указанных строк влияет только на результирующие наборы, созданные с использованием этого оператора. Если заданное значение равно нулю, подсказка игнорируется. Значение по умолчанию равно нулю.
blockquote>Обратите внимание, что он говорит «подсказку» - я бы сказал, что это означает, что водитель может игнорировать намек, если он действительно хочет ... и это звучит вот что происходит.
Я заметил, что ваше использование API отличается от того, что выражается Javadoc:
Попробуйте передать параметры в этом порядке
ResultSet.TYPE_FORWARD_ONLY,
ResultSet.CONCUR_READ_ONLY,
ResultSet.FETCH_FORWARD