Java Resultset.get *** (...) быстрее на строку или int? - PullRequest
3 голосов
/ 16 августа 2010

При переборе Resultset стандартным способом

while (rs.next()){
...
}

Для извлечения данных столбца (например, long) быстрее использовать

rs.getLong(String columnLabel)

или

rs.getLong(int columnIndex)

Предположительно, columnLabel лучше использовать во многих отношениях для более сильного кода, но есть ли значительные операционные потери, если каждый раз сопоставлять столбец со строкой (мы говорим о размерах таблицы ~ 40 м строк)?

Ответы [ 4 ]

3 голосов
/ 16 августа 2010

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

1 голос
/ 29 ноября 2010

Вы можете иметь лучшее из обоих!Скорость использования индексов с удобством обслуживания и безопасностью использования имен столбцов.

Во-первых - если вы не выполняете цикл по результирующему набору, просто используйте имена столбцов.

1. Определите набор целочисленных переменныхпо одному на каждый столбец, к которому вы будете обращаться.Имена переменных могут включать в себя имя столбца: например, iLast_Name.

2. Перед циклом набора результатов выполните итерацию по метаданным столбца и установите значение каждой целочисленной переменной в индекс столбца соответствующего столбца.название.Если индекс столбца «Last_Name» равен 3, тогда установите значение «iLast_Name» на 3.

3. В цикле набора результатов используйте целочисленные имена переменных в методах GET / SET.Имя переменной является визуальной подсказкой для разработчика / сопровождающего относительно фактического имени столбца, к которому осуществляется доступ, но значение является индексом столбца и обеспечит наилучшую производительность.

ПРИМЕЧАНИЕ: начальное отображение (т. Е. Имя столбца вотображение индекса) выполняется только один раз перед циклом, а не для каждой записи и столбца в цикле.

0 голосов
/ 16 августа 2010

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

0 голосов
/ 16 августа 2010

Я бы посоветовал вам больше думать о том, что яснее, чем быстрее.

Вот пример: скажем, у вас есть запрос select * from ...., и когда вы выполняете итерацию по ResultSet, вы вызываете String a = resultSet.getString(1), int i = resultSet.getInt(2) и т. Д. И т. П.

Затем вы меняете определение таблицы, чтобы у вас было еще несколько столбцов ... внезапно все ваши выигрыши сломаются, потому что вы ссылаетесь на все через int.Если бы вы ссылались по имени столбца, то не было бы перерыва.

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

...