怎么提升PostgreSQL性能

  介绍

本篇内容介绍了“怎么提升PostgreSQL性能”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!

<强>使用Postgres监测慢的Postgres查询

在这周早些时候,一个用于我们的图形编辑器上的小表(1500年10 gb,万行)的主键查询,在我们的一个(多个)数据库上发生来大的查询性能问题。

99.9%到查询都是非常迅速流畅的,但是在一些使用大量的枚举值的地方,这些查询会需要20秒。花费如此多到时间在数据库上,意味着使用者必须在浏览器面前等待图形编辑器的响应。很明显只因为这0.01%就会造成很不好到影响。

<强>查询和查询计划

下面是这个出问题的查询
,

SELECT  c.key,   ,,,c.x_key,   ,,,c.tags,   ,,x.name   得到context  c   JOIN  x   提醒才能c.x_key =x.key   WHERE  c.key =, ANY (数组(15368196,,,,11000,other  keys  -))   c.x_key 害;=1   c.tags 害;@>,数组(e # 39;废话# 39;];

表X有几千行数据,表C有1500万条数据。两张表的主键值“关键”都有适当的索引。这是一个非常简单清晰的主键查询。但有趣的是,当增加主键内容的数量,如在主键有11000个值的时候,通过在查询语句上加上解释(分析、缓冲区)我们得到如下的查询计划。
,

Nested  Loop (成本=6923.33,11770.59,行=1,宽度=362),(actual 时间=17128.188,22109.283,行=10858,循环=1)   缓冲区:大敌;shared =83494   ,→Bitmap  Heap  Scan 提醒context  c (成本=6923.33,11762.31,行=1,宽度=329),(actual 时间=17128.121,22031.783,行=10858,循环=1)   ,,,Recheck 电导率:,((tags  @>, & # 39;{等等}& # 39;::文本[]),以及(x_key =, 1))   ,,,过滤器:,(=key  ANY  (& # 39; {15368196, (a  lot  more  keys 这里)}& # 39;::整数[]))   ,,,缓冲:shared 打=50919   ,,,,,BitmapAnd (成本=6923.33,6923.33,行=269,宽度=0),(actual 时间=132.910,132.910,行=0,循环=1)   ,,,,,,缓冲:shared 打=1342   ,,,,,,,,Bitmap  Index  Scan 提醒context_tags_idx (成本=0.00,1149.61,行=15891,宽度=0),(actual 时间=64.614,64.614,行=264777,循环=1)   ,,,,,,,,,Index 电导率:,(tags  @>, & # 39;{等等}& # 39;::文本[])   ,,,,,,,,,缓冲:shared 打=401   ,,,,,,,,Bitmap  Index  Scan 提醒context_x_id_source_type_id_idx (成本=0.00,5773.47,行=268667,宽度=0),(actual 时间=54.648,54.648,行=267659,循环=1)   ,,,,,,,,,Index 电导率:,(=x_id  1)   ,,,,,,,,,缓冲:shared 打=941   ,→Index  Scan  using  x_pkey 提醒x (成本=0.00,8.27,行=1,宽度=37),(actual 时间=0.003,0.004,行=1,循环=10858)   ,,,Index 电导率:,(=x.key  1)   ,,,缓冲:shared 打=32575   Total 运行时:22117.417,

女士在结果的最底部你可以看的到,这个查询总共花费22秒。我们可以非常直观的通过下面的CPU使用率图观察到这22秒的花费。大部分的时间花费在Postgres和操作系统上,只有很少部分用于I/O只

怎么提升PostgreSQL性能

,在最低的层面,这些查询看起来就像是这些CPU利用率的峰值.CPU图很少有用,但是在这种条件下它证实了关键的一点:数据库并没有等待磁盘去读取数据。它在做一些排序,哈希以及行比较之类的事情。

第二个有趣的度量,就是距离这些峰值很近的轨迹,它们是由Postgres”取得”的行数(本例中没有返回,就看看再忽略掉吧)只

怎么提升PostgreSQL性能

,显然有些动作在规则的有条不紊的浏览过许多行:我们的查询。
,
Postgres的问题所在:位图扫描

<强>下面是行匹配的查询计划

,

缓冲区:shared 打=83494   ,→Bitmap  Heap  Scan 提醒context  c (成本=6923.33,11762.31,行=1,宽度=329),(actual 时间=17128.121,22031.783,行=10858,循环=1)   ,,,Recheck 电导率:,((tags  @>, & # 39;{等等}& # 39;::文本[]),以及(x_key =, 1))   ,,,过滤器:,(=key  ANY  (& # 39; {15368196, (a  lot  more  keys 这里)}& # 39;::整数[]))   ,,,缓冲区:50919年,shared 打击=

怎么提升PostgreSQL性能