我目前正在开发一个java应用程序,它在后台线程中执行以下操作。
如果查询进行了一些排序或加入,它将创建一个临时表,并将有一些额外的内存使用量。我的问题是,如果我的数据库连接被打开了很长时间(让我们说几个小时)并逐个批量获取,是否会因内存使用而导致数据库出现性能问题? (如果数据库也被其他线程同时使用。)或者数据库是为了有效地处理这些事情而设计的?
(在MySQL和Oracle的上下文中)
答案 0 :(得分:1)
从Oracle的角度来看,打开一个光标并定期从中获取它并不会产生那么大的影响,如果它保持打开状态......除非光标正在查询的基础数据发生变化查询首先开始。
如果是这样,Oracle数据库现在必须做额外的工作来查找查询开始时的数据(因为读取一致性!),所以现在需要查询数据块(在磁盘上或来自缓冲区缓存),如果数据已更改,则撤消表空间。
如果撤消表空间的大小不合适并且数据已经更改,您可能会发现光标提取失败并显示" ORA-01555:快照太旧"异常。
就内存使用而言,游标不会打开结果集并将其存储在某个地方;它只是一组数据库的指令,说明如何获取在执行提取时执行的下一行。存储在内存中的是那组指令,与它可以返回的数据量相比,它相对较小!
答案 1 :(得分:1)
这种机制似乎不太好。
尽管mysql(innodb引擎)和oracle都为select提供了一致的读取,
做这么长的选择可能会导致因构建cr阻塞和其他工作导致性能下降,
甚至在oracle中的ora-01555。
我认为你应该首先查询/导出所有数据,
然后逐个处理实际业务。
最后,首先查询所有数据不会减少内存使用量,
但减少内存和临时排序段/文件使用的连续时间。
或者你应该考虑将整个工作分成小块,
这样更好。