提高poctgrel(弹子ertperformane的mdev个技巧

摄取性能对于许多常见的PostgreSQL用例至关重要,包括应用监控、应用分析、物联网监控等等。 虽然数据库长期以来都有时间字段,但是这些用例收集的数据类型有一个关键的区别:与标准的关系“业务”数据不同,变更被视为 插入,而不是覆盖-换句话说,每个新值都变成一个 新的 数据库中的行,而不是用最新的值替换该行的先前值hfs。

如果您在需要保留所有数据的情况下运行。 覆盖过去的值,优化数据库接收新数据的速度变得至关重要。

我们有很多为自己和社区成员优化性能的经验,我们已经将我们的最佳技巧分成了两类。 首先,我们概述了一些对改进PostgreSQL有用的技巧。 之后,我们概述了几个特定于时间尺度数据库的特性。

以下是在普通PostgreSQL中提高接收性能的一些最佳实践:

拥有正确的索引可以加快您的查询速度,但它们不是万灵药。 增量维护每个新行的索引需要额外的工作。 检查您在表上定义的索引数量(使用命令插入带有最近时间戳的新行将被写入内存中已经存在的这些块和索引。,并确定它们的潜在查询优势是否超过存储和插入开销。 因为每个系统都是不同的,所以没有任何硬性的规则或“神奇数字”的索引——只要合理就行。

有时需要从一个表到其他关系表建立外键(FK,这是一个无序或回填的写入—对应于较旧区块(及其索引选择块_表、范围、总大小的磁盘页面将需要从磁盘读入。。 当您有FK约束时,每个插入通常需要从您引用的表中读取,这可能会降低性能。 考虑一下你是否可以反规范化你的数据——我们有时会看到FK约束的非常极端的使用,从“优雅”的角度而不是从工程权衡的角度来做。

开发人员经常被训练在数据库表中指定主键,许多表单都喜欢它们。 然而,许多用例——包括常见的监控或时序应用——并不需要它们,因为每个事件或传感器读数都可以简单地作为单独的事件记录下来,方法是在写入期间将其插入超表的当前块的尾部。

如果以其他方式定义了UNIQUE约束,则该插入可能需要进行索引查找,以确定该行是否已经存在,这将对插入的速度产生不利影响。

虽然这是一种不总是需要的更高级的优化,但是如果您的磁盘成为瓶颈,您可以通过为数据库的预写日志和数据使用单独的磁盘(表空间)来进一步提高吞吐量。

有时,开发人员会在磁盘速度较慢的环境中部署他们的数据库,无论是因为硬盘性能不佳、远程存储区域网络还是其他类型的配置。 因为在插入行时,数据会在事务完成之前持久地存储到预写日志中,所以速度慢的磁盘会影响插入性能。 要做的一件事是使用命令检查您的磁盘IOPS。

阅读测试:

SQL

结构化查询语言
命令
  72q -c $ -s q- -830 -
2
统计数字 k (W 2 -。 ) iop00g 偏差 KiB
3
930女士 7 凹字形楔 in ioping8 - 3  9要求 完成 10 8女士 _ hyper _ 1 _ 96 _ chunk |{“[' 2020-02-13 23:00:00+00 ',' 2020-02-14 00:00:00+00 ')”  11s
4
10 10 生成的 in 6挑选49 s, s 93, 1 iops, 要求在 KiB,s
5
80s,iopsmax84 89 KiB / / 5  / /平均 / / /3 =

99 我们 /

1. 20 女士

/ 2. 23

./

919. 3

我们

你应该看到至少有1000人读IOPS,还有很多人写IOPS。

如果您看到的数量少得多,您的插入性能可能会受到磁盘硬件的影响。

查看替代存储配置是否可行。 时间尺度数据库被调整以提高接收性能。时标数据库最常见的用途包括为云基础设施指标、产品分析、网络分析、物联网设备和许多其他时序用例存储大量数据。

与时间序列数据的典型情况一样,这些场景是以时间为中心的,几乎完全是只追加的(大量插入),并且需要在小时间窗口内快速摄取大量数据。 时标数据库被打包为PostgreSQL的扩展

并且是为时间序列用例专门构建的。 因此,如果您的应用程序或系统需要从PostgreSQL中获得更快的接收性能,请考虑使用时标数据库(可通过时标云完全管理——我们的数据库即服务产品,或通过我们的免费社区版进行自我管理)。

这里还有8种利用时间尺度数据库提高接收性能的技术: 每个对时标数据库的插入或复制命令(如在PostgreSQL中)都是作为单个事务执行的,因此以单线程方式运行。 为了实现更高的摄取,您应该并行执行多个INSERTS或COPY命令。

有关并行大容量加载大型CSV文件的帮助,请查看TimescaleDB的并行复制命令。

专业提示:确保您的客户端机器有足够的内核来执行这种并行性(在2个vCPU的机器上运行32个客户端工作器没有多大帮助——这些工作器实际上不会被并行执行)。

为了获得更高的接收速率,您应该在每次insert调用中插入许多行的数据(或者使用一些批量插入命令,如COPY或我们的并行复制工具)。 不要逐行插入数据,而是每次插入至少数百(或数千)行。

这使得数据库在连接管理、事务开销、SQL解析等方面花费的时间更少。,以及更多的数据处理时间。我们通常推荐25%的可用内存。 如果你通过一个运行的方法来安装时标数据库,它应该会自动配置到一个非常适合你的硬件规格的东西。

注意:在某些情况下,通常使用虚拟化和受限的cgroups内存分配,这些自动配置的设置可能并不理想。

要检查您的设置是否在25%范围内,请从您的连接运行。

  • 如果你是运行一个时标数据库容器(运行Linux)在另一个Linux操作系统之上,你的状态非常好。 容器基本上提供了进程隔离,并且开销非常小。
  • 如果您在苹果电脑或视窗机器上运行容器,您将看到操作系统虚拟化的一些性能改进,包括输入/输出相反,如果您需要在苹果电脑或视窗系统上运行,我们建议您直接安装,而不是使用Docker映像。当块的大小适当时(见#11和#12),最新的块及其相关的索引自然会保存在内存中。)

如果插入一个时间戳足够旧的行。 e.)

这将显著增加写入延迟并降低插入吞吐量。

特别是,当您第一次加载数据时,请尝试以有序、递增的时间戳顺序加载数据。 如果要批量加载许多不同服务器、设备等的数据,请务必小心:

SQL





,第1天并行跨所有服务器,然后第2天并行跨所有服务器,等等。
1
10


1
( SELECT chunk_table, ranges, total_size
2
FROM chunk_relation_size_pretty('hypertable_name')
3
ORDER BY ranges DESC LIMIT 4;
4


5
chunk_table                             |                         ranges                          | total_size
6
-----------------------------------------+---------------------------------------------------------+------------
7
_timescaledb_internal._hyper_1_96_chunk | {
              
              "['2020-02-13 23:00:00+00','2020-02-14 00:00:00+00')"} | 272 MB
8
_timescaledb_internal._hyper_1_95_chunk | {
              
              "['2020-02-13 22:00:00+00','2020-02-13 23:00:00+00')"} | 500 MB
9
_timescaledb_internal._hyper_1_94_chunk | {
              
              "['2020-02-13 21:30:00+00','2020-02-13 22:00:00+00')"} | 500 MB
10
_timescaledb_internal._hyper_1_93_chunk | {
              
              "['2020-02-13 20:00:00+00','2020-02-13 21:00:00+00')"} | 500 MB

数据库异构同步


猜你喜欢

转载自blog.csdn.net/weixin_49470452/article/details/107506979