В настоящее время я работаю над java-приложением, которое выполняет следующее в фоновом потоке.
Если запрос выполняет некоторую сортировку или объединение, он создаст временную таблицу и будет иметь некоторое дополнительное использование памяти. Мой вопрос заключается в том, что мое соединение с базой данных открывается в течение длительного времени (пусть несколько часов) и медленно выдает пакетный пакет, может ли это вызвать проблемы с производительностью в базе данных из-за использования памяти? (Если база данных одновременно используется другими потоками). Или базы данных предназначены для эффективного решения этих проблем?
(В контексте как MySQL, так и Oracle)
этот механизм кажется не очень хорошим.
хотя оба mysql (движок innodb) и оракул обеспечивают последовательное чтение для выбора,
такой длинный выбор может привести к снижению производительности за счет сборки блока cr и других работ,
даже ora-01555 в оракуле.
я думаю, что вы должны сначала запросить/экспортировать все данные,
затем обрабатывать фактический бизнес один за другим.
наконец, запрос всех данных сначала не уменьшит использование памяти,
но сокращают время континуума для сегмента памяти и временного сортировки темпа.
или вы решили разобрать всю работу на мелкие кусочки,
это лучше.
С точки зрения Oracle, открытие курсора и выборка из него периодически не имеют такой большой отдачи, если он остался открытым... если только базовые данные, которые курсор не запрашивает от изменений, начиная с первого запроса.
Если это так, база данных Oracle теперь должна выполнить дополнительную работу для поиска данных, как это было в начале запроса (с точки зрения согласованности чтения!), Поэтому теперь ему необходимо запросить блоки данных (либо на диске, либо из буфера кеш), а в случае изменения данных - табличное пространство отмены.
Если табличное пространство отменено не соответствующим образом, и количество данных изменилось, вы можете обнаружить, что выбор курсора завершился неудачей с помощью исключения "ORA-01555: моментальный снимок слишком старый".
Что касается использования памяти, курсор не открывает набор результатов и не сохраняет его где-то для вас; это просто набор инструкций для базы данных о том, как получить следующую строку, которая выполняется, когда вы делаете выборку. То, что хранится в памяти, - это набор инструкций, который относительно невелик по сравнению с количеством данных, которое он может вернуть!