PreparedStatements. Both DBMS & Java caching

 
 
 
Сообщения:9776
Вопрос следующий - зачем на стороне Java кешировать PreparedStatements с разобраным планом запроса, если сами СУБД это и так делают? Выходит, что мы кешируем два раза. Что мы пытаемся этим достичь?
PS: желательно ответы постить с пруф-линками.
Изменен:15 авг 2011 16:56
 
 
Сообщения:1688
Во-первых, на стороне клиента план запроса не кешируется (это было бы глупо, так как не дало бы прироста производительности, потому что надо было бы гонять по сети разобранный запрос, который содержит побольше структурированной информации чем сама строка SQL).

Приготовленный запрос храниться только на стороне сервера в общем для всех сессий кеше, чтобы все сессии могли переиспользовать его. Отсюда и берётся большая часть оптимизации в использовании процессорного времени и памяти.

Что кешируется на стороне клиента? - это идентификатор разобранного запроса (кеш тогда выглядит как набор пар [sql=>id]). Кроме того, большим отличием является то, что этот кеш "приготовленных" запросов на стороне клиента свой для каждой сессии. (Не знаю про остальные JDBC драйвера, но в реализации под Oracle 9/10 также зачем-то кешировались параметры запроса, и с этим была проблема утечки памяти, если соединения какое-то время активно переиспользовались из пула, т.е. не закрывались, и кеш не освобождался.)

В общих чертах выполнение запроса происходит так (команды отправляемые на сервер):

1. id = PREPARE (sql) <-- здесь на стороне сервера будет попытка получить план запроса из кеша.
2. EXECUTE (id, params1)
3. EXECUTE (id, params2) - N раз (optional)

Видно, что PREPARE одного и того же запроса выполняется только один раз на протяжении всей сессии (жизни соединения). Учитывая, что в большинстве сценариев используется пул соединений, это позволяет сохранить время ещё больше на выполнении дополнительного запроса по сети перед каждым EXECUTE.

П.С. Пруф-линк: http://www.vlad-yatsenko.eu/2011/08/server-side-vs-client-side-caching-of-prepared-statements/ :)

П.П.С. Если есть желание, можешь поковыряться в исходниках одного из JDBC драйверов, чтобы знать детали того, что там в действительности происходит.
 
 
Сообщения:9776
Quote:
Кроме того, большим отличием является то, что этот кеш "приготовленных" запросов на стороне клиента свой для каждой сессии.
Ну если говорить про интерфейс PooledConnection, то их реализации в пулах соединений шарят свои кеши между друг другом.
Вообще я проверил твои слова на MySQL драйвере (ох жеж и говнокод), ты оказался прав :) Нигде в интернетах об этом настолько точно и подробно не пишется, какашки авторы :)
:lol: :lol:
 
 
Сообщения:2398
Презентация, как работают PreparedStatement в Oracle (т.к. парсер ссылок работает неправильно, привожу ее в виде обычного текста:

Изменен:16 авг 2011 22:37
 
 
Сообщения:9776
Написал статью раскрывающую суть подготовленных запросов. Если считаете, что что-то следует добавить, говорите.
 
 
Сообщения:2398
Хорошая статья.
P. S. Я поправил ссылку на презентацию про Oracle.

 
Модераторы:Нет
Сейчас эту тему просматривают:Нет