我正在做一个连接到SQL Server的项目,以执行数千个存储程序并检索结果集。
我设置fast_executemany = True,并使用executemany来快速处理所有的Sprocs。但是在检索结果集时,我发现虽然前30-40个结果集的速度很快,但是检索其他的结果集就会逐渐变慢。
是不是因为前30-40个结果集被缓存在内存中,但是对于其他的结果集,游标对象要回到远程数据库中去取数据?如果是这样的话,我是否可以增量控制PyODBC的内存使用量,以便在总内存允许的情况下,所有的结果集都能被缓存?
"是不是因为前30-40个集合被缓存在内存中,但对于其他的,游标对象要回到远程数据库中去取数据?"
是的,但它们是缓存在服务器上,而不是客户端。当你开始运行一个代表 "数千个存储程序 "的批处理时,你也开始生成结果集。这些结果集在服务器上被缓冲,直到它们被客户端检索。这个缓冲区的大小是有限的,如果缓冲区满了,那么控制权就会返回到客户端,批处理就会被暂停,直到客户端检索一些结果集来释放一些空间。
正如在
如果你正在执行一个具有多个结果集的大批次,SQL Server会填满该输出缓冲区,直到它达到一个内部限制,无法继续处理更多的结果集。这时,控制权就会返回到客户端。当客户端开始消耗结果集时,SQL Server又开始执行该批处理,因为现在输出缓冲区中有可用的内存。