TranslateProject/published/202303/20230228.2 ⭐️ 3 tips to manage large Postgres databases.md
2023-04-01 08:21:59 +08:00

102 lines
4.5 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

[#]: subject: "3 tips to manage large Postgres databases"
[#]: via: "https://opensource.com/article/23/2/manage-large-postgres-databases"
[#]: author: "Elizabeth Garrett Christensen https://opensource.com/users/elizabethchristensencrunchydatacom"
[#]: collector: "lkxed"
[#]: translator: "geekpi"
[#]: reviewer: "wxy"
[#]: publisher: "wxy"
[#]: url: "https://linux.cn/article-15601-1.html"
管理大型 Postgres 数据库的 3 个技巧
======
![][0]
> 在处理庞大的数据库时,请尝试这些方便的解决方案,以解决常见的问题。
关系型数据库 PostgreSQL也被称为 Postgres已经越来越流行全球各地的企业和公共部门都在使用它。随着这种广泛的采用数据库已经变得比以前更大了。在 Crunchy Data我们经常与 20TB 以上的数据库打交道,而且我们现有的数据库还在继续增长。我的同事 David Christensen 和我收集了一些关于管理拥有巨大表的数据库的技巧。
### 大表
生产数据库通常由许多具有不同数据、大小和模式的表组成。常见的情况是,最终有一个巨大的、无序的数据库表,远远大于你数据库中的任何其他表。这个表经常存储活动日志或有时间戳的事件,而且对你的应用或用户来说是必要的。
真正的大表会因为很多原因造成挑战,但一个常见的原因是锁。对表的定期维护往往需要锁,但对大表的锁可能会使你的应用瘫痪,或导致堵塞和许多令人头痛的问题。我有一些做基本维护的技巧,比如添加列或索引,同时避免长期运行的锁。
**添加索引的问题**:在创建索引的过程中锁住表。如果你有一个庞大的表,这可能需要几个小时。
```
CREATE INDEX ON customers (last_name)
```
**方案**:使用 `CREATE INDEX CONCURRENTLY` 功能。这种方法将索引创建分成两部分,一部分是短暂的锁定,以创建索引,立即开始跟踪变化,但尽量减少应用阻塞,然后是完全建立该索引,之后查询可以开始使用它。
```
CREATE INDEX CONCURRENTLY ON customers (last_name)
```
### 添加列
在数据库的使用过程中,添加列是一个常见的请求,但是对于一个巨大的表来说,这可能是很棘手的,同样是由于锁的问题。
**问题**当你添加一个新的默认值为一个函数的列时Postgres 需要重写表。对于大表,这可能需要几个小时。
**方案**:将操作拆分为多条基本语句,总效果一致,但控制锁的时间。
添加列:
```
ALTER TABLE all_my_exes ADD COLUMN location text
```
添加默认值:
```
ALTER TABLE all_my_exes ALTER COLUMN location SET DEFAULT texas()
```
使用 `UPDATE` 来添加默认值:
```
UPDATE all_my_exes SET location = DEFAULT
```
### 添加约束条件
**问题**: 你想添加一个用于数据验证的检查约束。但是如果你使用直接的方法来添加约束,它将锁定表,同时验证表中的所有现有数据。另外,如果在验证的任何时候出现错误,它将回滚。
```
ALTER TABLE favorite_bands ADD CONSTRAINT name_check CHECK (name = 'Led Zeppelin')
```
**方案**:告诉 Postgres 这个约束,但不要验证它。在第二步中进行验证。这将在第一步中进行短暂的锁定,确保所有新的/修改过的行都符合约束条件,然后在另一步骤中进行验证,以确认所有现有的数据都通过约束条件。
告诉 Postgres 这个约束,但不要强制执行它:
```
ALTER TABLE favorite_bands ADD CONSTRAINT name_check CHECK (name = 'Led Zeppelin') NOT VALID
```
然后在创建后**验证**它:
```
ALTER TABLE favorite_bands VALIDATE CONSTRAINT name_check
```
### 想了解更多?
David Christensen 和我将在 3 月 9 号到 10 到在加州帕萨迪纳参加 SCaLE 的 Postgres Days。很多来自 Postgres 社区的优秀人士也会在那里。加入我们吧!
--------------------------------------------------------------------------------
via: https://opensource.com/article/23/2/manage-large-postgres-databases
作者:[Elizabeth Garrett Christensen][a]
选题:[lkxed][b]
译者:[geekpi](https://github.com/geekpi)
校对:[wxy](https://github.com/wxy)
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
[a]: https://opensource.com/users/elizabethchristensencrunchydatacom
[b]: https://github.com/lkxed/
[0]: https://img.linux.net.cn/data/attachment/album/202303/06/113049bkunsxun1clzuca8.jpg