你确定这真的是一个问题吗?我只提到因为开放数据库的成本可能很小,特别是“开放”很可能包括同步等待数据库的所有未完成的事务,并进行基本的一致性检查(特别是加载几页存储的数据)在磁盘上)。
一旦完成,没有活动,服务器上就不需要维护很多数据了。
如果您考虑一下,数据库系统最基本的功能就是使用内存管理数据库页面的缓存。当对一条数据发出请求时,系统会定位它所在的实际页面,并检查 RAM 以查看它是否已加载。如果没有,它会从磁盘加载它。
如果您还注意到,大量的数据库“元”数据存储在数据库中。这意味着当系统想知道任何事情时,它会有效地使用自己来定位信息,特别是数据页面缓存子系统。
像任何其他缓存一样,当数据过期并且不再需要时,它会被刷新回磁盘并在必要时重新获取。
因此,这意味着一旦数据库“打开”,维护其状态所需的任何信息都可能通过数据缓存子系统进行维护,并且对于未使用的数据库,将其释放回磁盘以为当前流量腾出空间。
这就是为什么我很好奇您是否测试过您的候选数据库以查看您是否遇到了有关此问题的问题,或者数据库是否甚至具有“打开数据库”的概念。
当我们作为客户端讨论这个问题时,重点往往是与数据库服务器的连接。但是一旦所有这些都关闭,我认为系统不会在内存中保留任何大量关于非活动特定数据库的数据。
毕竟,数据库中的所有(ALL)数据都存储“相同”,表是表是表,索引是索引是索引,特别是在管理所有数据页面的中央服务器上作为一个单一的大数据“汤”。
您可能遇到的唯一问题是,如果您的数据库碰巧专门为每个数据库创建了一个文件,并且该文件保持打开状态。最终你可能会用完文件描述符。
但是大多数现代系统不这样做,它们将所有内容存储在一大堆文件中,而不管它们位于哪个数据库或模式中(当然,除非您进行特定的表空间分配或服务器允许)。
所以,本质上,我不认为这是一个问题,因为我认为现代数据库并没有真正做出你在内部谈论的那种区别。多个数据库或模式是系统内的逻辑工件,而不是技术实现,并且所有数据页最终都位于同一个缓存中并使用相同的资源,而不管它们来自什么模式、数据库、表或索引.
我会对您选择的数据库进行一些测试,看看这是否是一个问题。例如,您可以创建 1M 个数据库,尽可能降低数据库的内存,然后开始循环浏览它们,一次打开多个您认为合适的(10、100、1000,等等),看看是否你有任何问题。
最后,对于任何特定的数据库,我都不“知道”任何这些,这只是对历史数据库如何实现的直觉。