Postgres中元组和行有什么区别?

27

我大概了解元组是一行数据。但是,我正在使用Heroku上的Postgres dev计划,并且它有一个10,000行的限制。而我的n_live_tup条目却有100,000个。这是怎么回事呢?

3个回答

34

"Tuple" 是抽象的术语,"row" 是具体实现。
就像 "relation""table"

在 Postgres 的 MVCC 实现 中,同一张表的多个实例可以同时存在 - 用于相同表的不同快照或作为过时的 "dead tuples"。在 Postgres 的术语中,在这种情况下,“row”是一个大类,而“tuple”则用于表示其中的一个实例。但这只是“更像是指南而非实际规则”。

否则,这些术语通常被用来表示相同的含义。您可以在维基百科上找到更多相关信息。

不知道 Heroku 政策背后的原因。但是,在 pg_stat_user_tablespgstattuple 中的 n_live_tup 数字代表表中的“活动行数”。请参见:


PostgreSQL使用固定的页面大小(通常为8 kB),不允许元组跨越多个页面。这个语句是否也适用于索引条目? - Ilya Loskutov
@IlyaLoskutov:是的。但这还不止于此:请参见:https://dba.stackexchange.com/a/217088/3684 - Erwin Brandstetter

1
在Postgres中,术语“行”表示一个条目的逻辑表示。
“元组”是该条目的物理表示。
(注意:为了避免名称混淆,我说的是表中的条目)
所以,假设有一个新创建的条目R1。此时,这个条目既是行也是元组。但是当它被更新时,将创建一个新的条目R2,类似地,每当这个条目被更新时,都会创建一个新的条目R3、R4等等。每当创建一个新的条目时,如果它没有被数据库中的任何事务使用,旧的条目就会被标记为无效。
因此,如果我们仔细观察,对于这个单个条目,我们在数据库中有多个版本,但是当任何客户端/应用程序请求此条目时,它应该返回只有一个条目。因此,这个条目的多个版本(R1、R2、R3等)被称为元组,而最新的元组(除非对该条目的删除命令已经下达)将成为应用程序的行。

0
在PostgreSQL中,表中的一行通常被称为元组。然而,在Heroku上的Postgres开发计划中,n_live_tup参数指的是预期的活动元组数量。活动元组包括可见和不可见的行,并且它们可能比整个表格包含更多的行。 这似乎是你达到限制的原因。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接