我实际上了解导致问题的原因,但无法找出适用于 Django 的解决方案。
假设您尝试通过网络从 Oracle 数据库读取 10,000 条记录,通常这会导致 10,000 个网络连接打开和关闭,从而导致性能不佳。
Oracle 的答案是每个连接一次发送 1000 条记录,这显着提高了速度。
但是在我的例子中,每行包含 1-2MB 的 blob,因此尝试预取 1000 条记录意味着在我下载(并保存在内存中)1GB-2GB 的数据之前什么也不会发生。
oracle 的 sqlplus 提供了控制它的选项,可以使用
fast
参数或发出 set rowprefetch 10
但我找不到适用于 Django 的解决方案。
我只想预取 10 条左右的记录
您应该能够使用
QuerySet.defer('field_name')
将字段标记为延迟加载。
Django 文档提到了
defer()
的一些注意事项,并建议仅当您真正确定知道自己在做什么时才使用它。例如,如果您的代码访问延迟字段,则会进行单独的 SQL 查询来获取您访问的字段的每个实例。在具有延迟字段的对象上调用 save()
也有一些注意事项。