在 Python 或 PostgreSQL 中操作数据更快、内存效率更高吗?

Adn*_*uei 5 python sql postgresql psycopg2

假设我有一个 PostgreSQL 表,有 5-6 列和几百行。使用 psycopg2 将整个表加载到我的 Python 程序中并使用 Python 选择我想要的行并按照我的意愿对行进行排序会更有效吗?或者使用 SQL 选择所需的行,对它们进行排序,然后仅将这些特定行加载到我的 Python 程序中会更有效吗?

我所说的“有效”是指:

  1. 内存使用情况。
  2. 速度。

此外,随着表大小的增加,这些因素将如何开始变化?比如说,表现在有几百万行?

Toa*_*gma 7

在 PostgreSQL 中执行所有这些操作几乎总是会更快。这些数据库系统经过精心设计,能够很好地扩展海量数据,并针对其典型用例进行了高度优化。例如,他们不必从磁盘加载所有数据来执行最基本的过滤器[1]

即使情况并非如此,仅网络延迟/使用情况就足以平衡这一点,特别是如果您经常运行查询。


Gor*_*off 3

实际上,如果您将已加载到内存中的数据与从数据库中检索的数据进行比较,那么内存中的操作通常会更快。数据库有开销:

  • 它们位于同一服务器或不同服务器上的单独进程中,因此数据和命令需要在它们之间移动。
  • 需要解析和优化查询。
  • 数据库支持多个用户,因此其他工作可能会耗尽资源。
  • 数据库维护 ACID 属性和数据完整性,这会增加额外的开销。

与每个查询的等效内存中操作相比,前两个特别增加了开销。

这并不意味着数据库没有优势,特别是对于复杂的查询:

  • 他们实现多种不同的算法,并有一个优化器来选择最好的算法。
  • 他们可以利用更多资源——特别是通过并行运行。
  • 他们(有时)可以缓存结果,从而节省大量时间。

数据库的优势并不在于它们始终提供最佳性能。优点是它们通过简单的接口在非常广泛的请求中提供了良好的性能(即使你不喜欢 SQL,我认为你需要承认它比用 SQL 编写代码更简单、更简洁、更灵活)第三代语言)。

此外,数据库通过 ACID 属性和其他支持数据完整性的机制来保护数据。