2014-12-26 2 views
2

У меня есть долгоживущая программа на C++, которая выполняет множество операторов SQL в базе данных MySQL. В настоящее время я использую кучу статического sql :: PreparedStatement *, созданного (один раз) в каждой функции, которая должна быть SELECT/INSERT/UPDATE, а затем они снова и снова перезаписываются и повторно выполняются. Это хорошо работает, но мне интересно о сервере и программа ресурса использования:MySQL PreparedStatement Предостережения

  • Где каждый PreparedStatement хранить свою информацию (клиент/сервер/оба?)
  • Должен ли я беспокоиться о один PreparedStatement будет плохо , но все в порядке?
  • Должен ли я обновлять/воссоздавать PreparedStatements?
  • Открытые, но незанятые PreparedStatements связывают значительные ресурсы БД между использованием?
  • Есть ли лучший способ обработать активность БД в программе, которая должна выполнять 20-30 различных типов запросов, когда запросы происходят иногда, а не в каком-либо конкретном порядке?

Спасибо!

ответ

0

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

Для справки max_prepared statement_count является here.

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

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

Кроме того, вы можете захотеть взглянуть here и here

+0

Спасибо, это полезная информация. У вас есть (или знаете, где найти) приблизительные числа для использования памяти или максимальные подготовленные выписки за сеанс? Если я значительно ниже пределов, я не буду беспокоиться о разработке какой-то сложной структуры для этого, но если я буду близок, я могу теперь укусить пулю. (Все утверждения довольно просты - INSERT или UPDATE или одиночные таблицы SELECT. Ничто из того, что должно сделать работу БД очень трудной, за исключением того, что иногда может быть возвращено много строк.) –

+0

См. Мое редактирование. Надеюсь, вы сочтете это полезным. – DNT

+0

Элемент конфигурации max_prepared_statement_count очень обнадеживает (особенно, поскольку это значение на сервере). Я знаю, какой вид использования мой сервер должен увидеть, и мое ожидаемое количество PreparedStatements значительно ниже 16k. Я буду мешать с инструментами памяти, но на самом деле, если PreparedStatement не выделяет много мегабайт (что кажется маловероятным), у меня не будет никаких проблем. Еще раз спасибо! –

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