2014-12-10 5 views
1

Несколько дней назад мне пришлось создать некоторые тесты производительности производительности, используя инфраструктуру вычислений в памяти. Поэтому для этого мне понадобился большой пул данных, который был увеличен постепенно с учетом различных тестов производительности.Почему PreparedStatement намного быстрее, чем заявление?

БД была Oracle, содержащая таблицу из 22 полей. Эта таблица должна была заполняться постепенно с 1 млн записей до 100 млн записей.

Для заполнения таблицы 1 мил, я сгенерировал случайные данные теста и использовал заявление Java, чтобы вставить его в БД, и это заняло около 17 и 16 секунд минут. После этого я быстро понял, что для заполнения таблицы столов на 100 миллионов займет время, поэтому я попробовал ее с PreparedStatement, потому что я знал, что это немного быстрее ... но разница была такой огромной: 1 минута и 24 секунды, что у меня есть начал искать в Интернете причину этого и выяснил некоторые причины, но ничего, что, на мой взгляд, должно иметь такое влияние.

это то, что я обнаружил, что могло бы объяснить эту разницу: LINK

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

BUT все данные были сгенерированы случайным образом, поэтому не требуется существенное кэширование со стороны оракулов.

+3

Читайте о жестком и мягком разборе Oracle и SGA. Существует много циклов обработки, используемых для неподготовленной/литеральной версии вставки для жесткого разбора. – OldProgrammer

+0

Я рекомендую вам проследить программу до и после внесения таких изменений. Убедитесь, что тест справедлив. Затем профилируйте полученные файлы трассировки. Результаты часто удивляют. – jeff6times7

ответ

3

Возможно, Oracle может кэшировать план запроса в кэше операторов; в Руководстве Implicit Statement Caching в Oracle® Database JDBC разработчика,

При включении неявных себе кэширование, JDBC автоматически кэширует приготовленное или вызываемое заявление, когда вы называете close метод этого объекта оператора. Готовые и вызываемые операторы кэшируются и извлекаются с использованием стандартных объектов объекта соединения и методов объекта-оператора.

Простые утверждения не кэшируются неявно, потому что неявное кэширование Statement использует строку SQL в качестве ключа, а простые инструкции создаются без строки SQL. Следовательно, неявное кэширование Statement применяется только к объектам OraclePreparedStatement и OracleCallableStatement, которые создаются с помощью строки SQL.

+0

ok, поэтому давайте скажем, что план запроса кэширован, но у меня все еще есть 22 случайных поля для каждой вставки, это больше половины всего оператора insert ... – aurelius

+3

Но вы не отправляете весь запрос; просто идентификатор запроса (и ваши поля). Не запрос * плюс * поля. Затем добавьте кеширование. –

+0

Я не вижу, где закрывается PreparedStatement.Я, конечно, понимаю, как неявное кэширование может быть большой помощью, если кто-то закрывает и повторно открывает подготовленный оператор с тем же SQL, но образец PreparedStatement в вопросе просто выглядит для меня как стандартная реализация подготовленных операторов (отправьте заявление один раз , затем отправьте параметры для каждого запроса). Я что-то пропустил? –

Смежные вопросы