JDBC: LIMIT против setmaxrows (Resultset)

2

Я хочу выбрать 10 лучших записей, я могу использовать один из них:

  • Использование setmaxrows в Resultset
  • Использование LIMIT и OFFSET в операторе sql

Мой вопрос: каковы преимущества и недостатки между ними?

Теги:
jdbc

4 ответа

4

В большинстве случаев вы хотите использовать предложение LIMIT, но в конце дня оба достигнут того, чего вы хотите. Этот ответ ориентирован на JDBC и PostgreSQL, но применим к другим языкам и базам данных, которые используют аналогичную модель.

Документация JDBC для Statement.setMaxRows говорит

Если предел превышен, лишние строки молча отбрасываются.

то есть. Сервер базы данных может возвращать больше строк, но клиент просто игнорирует их. Ограничение драйвера PostgreSQL JDBC ограничено как на стороне клиента, так и на стороне сервера. Для клиентской стороны рассмотрите использование maxRows в AbstractJdbc2ResultSet. Для серверной стороны посмотрите maxRows в QueryExecutorImpl.

Серверная, PostgreSQL LIMIT документация говорит:

Оптимизатор запросов учитывает LIMIT при генерации запроса план

Таким образом, пока запрос разумный, он будет загружать только те данные, которые ему необходимы для выполнения запроса.

  • 2
    Я думаю, что вы не правы: «кажется, ограничивает только на стороне клиента» Вы можете посмотреть на org.postgresql.core.v3.QueryExecutorImpl#sendOneQuery .
  • 0
    Я верю, что ты прав @sibnick. Я обновлю ответ. Не смотря на исходном сервере кода, я предполагаю , что это возможно , что сервер может игнорировать информацию, но кажется , что вряд ли (и плохой ход).
Показать ещё 1 комментарий
2

setFetchSize. Дает драйверу JDBC подсказку о количестве строк, которые должны быть извлечены из базы данных, когда для объектов ResultSet, сгенерированных этим оператором, требуется больше строк.

setMaxRows Устанавливает ограничение для максимального количества строк, которое любой объект ResultSet, сгенерированный этим объектом Statement, может содержать указанный номер.

Думаю, используя выше 2 JDBC API, вы можете попробовать с помощью setFetchSize вы можете попробовать, если он работает для 100K записей. Кроме того, вы можете выбрать пакет и сформировать ArrayList и вернуть его в отчет Jasper.

2

Преимущество setmaxrows заключается в том, что вы можете создавать универсальные инструкции, действующие в Postgres, Oracle, Mysql и т.д. Поскольку Oracle использует синтаксис rownum, postgres - limit, msqsql - top

Скорость не кажется разницей.

  • 2
    ... если драйвер JDBC достаточно умен
  • 0
    У вас есть информация о некоторых водителях, которые не умны в 2015 году?
Показать ещё 1 комментарий
1

Не уверен, что я прав, но я помню, в прошлом я был вовлечен в большой проект, чтобы изменить все запросы, которые, как ожидалось, вернут одну строку в "TOP 1" или numrows = 1. Причина заключалась в том, что БД прекратила поиск "следующих возможных совпадений", когда был использован этот "намек". И в условиях большого объема это действительно имело значение. Замечание о том, что вы можете "игнорировать" лишние записи в клиенте или в наборе результатов, недостаточно. Вы должны избегать ненужных чтений как можно раньше. Но я понятия не имею, добавляют ли методы JDBC эти специальные привязки к запросу y/n. Мне, возможно, придется протестировать, однако, чтобы увидеть и использовать его... я не специалист по db и могу представить, что я не прав, но "Speedwise кажется неважным" может быть неправильным предположением... Например. если вас попросят найти в поле для красных шаров, и вам нужен только один, он не добавит значения, чтобы продолжать поиск всего, где вам достаточно... Тогда важно указать "TOP 1"...

Ещё вопросы

Сообщество Overcoder
Наверх
Меню