巨大的表项会降低查询性能吗?

时间:2016-12-08 09:37:33

标签: postgresql

我们假设我有一张表persons,如下所示:

|id | name | age | |---|------|-----| |1 |foo |21 | |2 |bar |22 | |3 |baz |23 |

并添加一个新列history,我存储了一个大的JSON blob,让我们说~4MB。

|id | name | age | history | |---|------|-----|----------| |1 |foo |21 |JSON ~ 4MB| |2 |bar |22 |JSON ~ 4MB| |3 |baz |23 |JSON ~ 4MB|

这会对整个表格产生负面影响吗?

如下查询:

  • SELECT name FROM persons WHERE ...(猜猜:这不会影响表现)
  • SELECT * FROM persons WHERE ...(猜猜:这会影响性能,因为数据库需要阅读并发送大历史记录条目)

是否有其他副作用,如各种不断增长的缓存等可能会降低整体数据库性能?

2 个答案:

答案 0 :(得分:1)

JSON属性不会存储在表本身中,而是存储在属于表的 TOAST中,这是所有超过一定大小的可变长度条目的地方存储(和压缩)。

不读取JSON值的查询根本不会影响性能,因为甚至不会触及TOAST条目。只有当您读取JSON值时,性能才会受到影响,主要是因为从存储中读取的额外数据并传输到客户端,但当然附加数据也将驻留在数据库缓存中并与其他数据竞争。

所以你的猜测是正确的。

答案 1 :(得分:0)

取决于使用此表的事务数量和事务类型(创建,读取,更新,删除)可能会出现性能问题。

如果您要更新历史记录批次,您将进行大量更新事务,这将导致该表重新索引每个更新事务。

假设每次用户登录时都会调用表人员,并且还会更新该用户的历史记录。您正在进行选择和更新,如果这种情况发生很多,将导致大量重建索引,并且可能在用户登录时导致问题而其他用户也在更新历史记录。

  

更好的选择是为personupdates设置一个单独的表   与人员表的关系。