2017-04-20 49 views
0

SELECT * FROM people这样的查询可能会产生严重的内存问题,即很多人喜欢称之为“超出内存”。使用数据库时,迭代器如何工作?

许多程序员调用迭代器来减少内存消耗。迭代器是一种“play-n-pause video recording”,意味着它们产生一个值,停止,产生一个值等等,避免一次产生所有的值。在Python中的一个例子可能是以下几点:

def myIterator(): 
    for i in range(10): 
    yield i * 2 

现在,当涉及到使用迭代从数据库中提取数据,我得到很困惑。我总是被告知限制对数据库的查询数量,因为它可能会成为一个瓶颈,并且使用迭代器,我认为增加查询的数量。是这样吗?迭代器如何处理数据库查询?这是短床单的知名问题吗?另外,如果在迭代器的提取阶段,数据库中会添加一些数据,会发生什么情况?

P.S.我的问题与特定的编程语言无关,但总的来说。

+0

您认为获得前10名和超过100名用户的前10000名的区别是什么? – maSTAShuFu

+0

嗯,这取决于。如果您仅使用LIMIT功能进行单个查询,则不需要任何人员。但是,如果你在时间取1行,那么区别在于,在第一种情况下,你将做出10个查询,在第二个10000和第三个100中。 – zer0uno

回答

0

当使用迭代器时,RDBMS可以提供​​帮助。 DB客户端发送一个请求,DB向第一批行回复;一旦客户确认收到,服务器停止发送,并等待。

DB客户端库允许使用迭代器“消化”数据的程序,直到程序迭代已经缓冲的内容为止。此时,它要求RDBMS继续发送数据。

由程序决定如何处理数据。如果它不将整个内容存储在内存中,它只会使用与由DB客户端缓存的数据一样多的数据。

+0

因此,这样DB会更忙吗?它会更多地参与?瓶颈概率是否增加? – zer0uno

+0

@antox RDBMS确实需要存储每个活动读取的位置以及其他一些信息,因此从这个意义上来说DB确实变得更加繁忙。另一方面,一旦RDBMS向DB客户端发送下一批数据,它就不会为您的请求使用额外的CPU,除非您要求更多数据。有很多客户同时做这件事,RDBMS很有可能成为瓶颈,但通常最慢的部分是磁盘I/O,而不是CPU。 – dasblinkenlight

+0

因此,使用迭代器或多或少就像在MySQL中执行以下查询'SELECT * FROM people LIMIT offset,1',在每一转角1处添加偏移值。是这样吗? – zer0uno