2015-06-09 3 views
4

В JDBC размер выборки по умолчанию равен 10, но я думаю, что это не лучший размер выборки, когда у меня есть миллион строк. Я понимаю, что слишком большой размер выборки снижает производительность, но также и если размер выборки слишком высок.Как определить оптимальный размер выборки для запроса выбора

Как найти оптимальный размер? И влияет ли это на сторону БД, она лишает много памяти?

+0

Это не пережевывает память. Oracle использует шаблон дизайна производителя-потребителя, поэтому результирующие строки генерируются по запросу (когда вы вызываете выборку). Предполагается, что размер выборки уменьшит количество раундов между базой данных и приложением. Я не уверен в JDBC, но по крайней мере в OCI вы также можете указать размер принимающего буфера в байтах (мегабайт). – ibre5041

+0

Значение по умолчанию - [ноль] (http://docs.oracle.com/javase/7/docs/api/java/sql/Statement.html#setFetchSize (int)). – EJP

+0

здесь говорится: «По умолчанию, когда Oracle JDBC выполняет запрос, он получает результирующий набор из 10 строк за раз из курсора базы данных. « http://docs.oracle.com/cd/A87860_01/doc/java .817/a83724/resltse5.htm – KKO

ответ

8

Как и в случае с почти любым способом, оптимальный размер для конкретного параметра - это сравнение рабочей нагрузки, которую вы пытаетесь оптимизировать с различными значениями параметра. В этом случае вам нужно будет запускать свой код с различными настройками размера выборки, оценивать результаты и выбирать оптимальные настройки.

В подавляющем большинстве случаев люди выбирают размер выборки 100 или 1000, и это оказывается достаточно оптимальной настройкой. Разница в производительности между значениями в этой точке обычно минимальна - вы ожидаете, что большая часть разницы в производительности между прогонами была результатом нормальной случайной вариации, а не вызвана изменениями размера выборки. Если вы пытаетесь получить последнюю полезность производительности для определенной рабочей нагрузки в определенной конфигурации, вы можете, конечно, сделать этот анализ. Однако для большинства людей 100 или 1000 достаточно хороши.

8

Если ваши строки большие, то имейте в виду, что все строки, которые вы получаете сразу, должны быть сохранены в куче Java во внутренних буферах драйвера. В 12c Oracle имеет столбцы VARCHAR (32k), если у вас есть 50 из них, и они заполнены, это 1 600 000 символов в строке. Каждый символ имеет 2 байта в Java. Таким образом, каждая строка может занимать до 3,2 МБ. Если вы извлекаете строки 100 на 100, вам понадобится 320 Мбайт кучи для хранения данных, и это просто для одного заявления. Таким образом, вы должны только увеличить размер предварительной выборки строк для запросов, которые извлекают разумно небольшие строки (небольшие по размеру данных).

0

JDBC имеет по умолчанию размера предварительной выборки 10. Выезда OracleConnection.getDefaultRowPrefetch в JDBC Javadoc

3

Значения по умолчанию JDBC размера выборки свойства является драйвером конкретных и драйвер Oracle это 10 действительно.

Для некоторых запросов размер выборки должен быть больше, для некоторых меньших.

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

Посмотрите на эту статью:

http://makejavafaster.blogspot.com/2015/06/jdbc-fetch-size-performance.html

есть описание того, как настроить размер выборки в глобальном масштабе и перезаписать его для тщательно отобранных запросов с использованием различных подходов: Hibernate, JPA, Spring JDBC шаблоны или ядро ​​JDBC API. И некоторые простые тесты для оракула базы данных.

Как правило, вы можете:

  • набор FetchSize к 50 - 100 как глобальные настройки
  • набор FetchSize к 100 - 500 (или даже больше) для индивидуальных запросов
Смежные вопросы