小编Fra*_*eil的帖子

在 9.1 下仍然推荐常规的 VACUUM ANALYZE 吗?

我在 Ubuntu 上使用 PostgreSQL 9.1。VACUUM ANALYZE仍然推荐预定,还是 autovacuum 足以满足所有需求?

如果答案是“视情况而定”,那么:

  • 我有一个较大的数据库(30 GiB 压缩转储大小,200 GiB 数据目录)
  • 我对数据库做 ETL,每周导入接近 300 万行
  • 变化最频繁的表全部继承自一个主表,主表中没有数据(数据按周分区)
  • 我创建每小时汇总,并从那里创建每日、每周和每月报告

我问是因为预定的时间VACUUM ANALYZE会影响我的报告。它运行了 5 个多小时,本周我不得不杀死它两次,因为它影响了常规的数据库导入。check_postgres不会报告数据库有任何显着膨胀,所以这不是真正的问题。

从文档中,autovacuum 也应该处理事务 ID 环绕。问题是:我还需要一个VACUUM ANALYZE吗?

postgresql etl vacuum

38
推荐指数
3
解决办法
4万
查看次数

我应该花时间将列类型从 CHAR(36) 更改为 UUID 吗?

我的数据库中已经有几百万行了。我在设计模式时不知道 PostgreSQL UUID 数据类型。

其中一个表有 1600 万行(每个分片大约有 350 万到 400 万条记录),每天增长大约 50 万条记录。如果需要,我仍然可以将生产系统关闭几个小时。一两周内我不会有这种奢侈。

我的问题是,这样做是否值得?我想知道 JOIN 性能、磁盘空间使用(完整的 gzip 转储是 1.25 GiB),以及这种性质的事情。

表架构是:

# \d twitter_interactions
                Table "public.twitter_interactions"
         Column          |            Type             | Modifiers 
-------------------------+-----------------------------+-----------
 interaction_id          | character(36)               | not null
 status_text             | character varying(1024)     | not null
 screen_name             | character varying(40)       | not null
 twitter_user_id         | bigint                      | 
 replying_to_screen_name | character varying(40)       | 
 source                  | character varying(240)      | not null
 tweet_id                | bigint                      | not null
 created_at              | timestamp without time zone …
Run Code Online (Sandbox Code Playgroud)

postgresql

14
推荐指数
2
解决办法
3066
查看次数

如何仅根据字段名称访问 NEW 或 OLD 字段?

我正在编写一个验证触发器。触发器必须验证数组的总和是否等于另一个字段。由于我有许多此验证的实例,因此我想编写一个过程并创建多个触发器,每个触发器都有一组不同的要检查的字段。

例如,我有以下架构:

CREATE TABLE daily_reports(
     start_on date
   , show_id uuid
   , primary key(start_on, show_id)

     -- _graph are hourly values, while _count is total for the report
   , impressions_count bigint not null
   , impressions_graph bigint[] not null

   -- interactions_count, interactions_graph
   -- twitter_interactions_count, twitter_interactions_graph
);
Run Code Online (Sandbox Code Playgroud)

验证必须确认impressions_count = sum(impressions_graph)

我被卡住了,因为我不知道如何NEW从 plpgsql 中动态访问一个字段:

CREATE FUNCTION validate_sum_of_array_equals_other() RETURNS TRIGGER AS $$
DECLARE
  total bigint;
  array_sum bigint;
BEGIN
  -- TG_NARGS = 2
  -- TG_ARGV[0] = 'impressions_count'
  -- TG_ARGV[1] = 'impressions_graph'

  -- How …
Run Code Online (Sandbox Code Playgroud)

postgresql trigger plpgsql composite-types

10
推荐指数
1
解决办法
1万
查看次数

PostgreSQL下如何指定触发器执行顺序?

我正在使用触发器使用“经典”基于时间的分区。我发现需要一个单独的触发器,它在原始表上运行。

CREATE TABLE twitter_interactions(...);
CREATE OR REPLACE FUNCTION insert_twitter_interactions ...;
CREATE TRIGGER insert_twitter_interactions_trig
  BEFORE INSERT OR UPDATE on twitter_interactions
  FOR EACH ROW EXECUTE PROCEDURE insert_twitter_interactions();

CREATE OR REPLACE FUNCTION maintain_data_pointers ...;
CREATE TRIGGER maintain_data_pointers_trig
  BEFORE INSERT OR UPDATE on twitter_interactions
  FOR EACH ROW EXECUTE PROCEDURE insert_twitter_interactions();
Run Code Online (Sandbox Code Playgroud)

我还没有完全验证,但我怀疑分区逻辑在维护触发器之前运行,并且由于该行没有出现在父表中,因此第二个触发器永远不会触发。

如果我也想运行,会发生什么AFTER INSERT OR UPDATE?由于该行未将其放入原始表中,因此我无法实现 after 逻辑。

postgresql trigger

9
推荐指数
2
解决办法
9287
查看次数

深入了解长时间运行的 INSERT INTO ... SELECT

我有一个更新汇总表的大型 SQL 插入语句。该过程通常每小时运行一次,并需要大约 5 到 10 分钟来计算这段时间内的唯一身份。我“愚蠢地”选择在 15 天内运行它,我想知道我是否可以做些什么来了解它的位置。该过程已经运行了 9 个小时。我只想知道它是否仍然是正在运行的 SELECT 查询,或者它是否正在插入数据:我需要知道我是否应该停止它并执行较小的批处理,或者我是否应该让它完成。

由于该声明,我知道服务器已经使用了 9 个小时:

select
    now() - xact_start
  , procpid
  , client_addr
  , client_port
  , current_query
from pg_stat_activity
where xact_start is not null
order by 1 desc
Run Code Online (Sandbox Code Playgroud)

实际查询是:

INSERT INTO summary_show_unique_personas(period, show_id, persona_id, interactions_count)
  SELECT
      date_trunc('hour', created_at) AS period
    , show_id
    , persona_id
    , COUNT(*)
  FROM
          twitter_interactions
    JOIN  show_bindings        USING(interaction_id)
    JOIN  twitter_personas     USING(screen_name)
  WHERE
        created_at >= '__PERIOD_START_AT__' AND created_at < '__PERIOD_END_AT__'
    AND interaction_created_at >= '__PERIOD_START_AT__' AND interaction_created_at < …
Run Code Online (Sandbox Code Playgroud)

postgresql

7
推荐指数
1
解决办法
1087
查看次数

使用 PgBouncer 与 HAProxy 的优势?

使用一个比另一个有什么优势吗?我只是在寻找从我的进程中隐藏主服务器和从服务器的实际 IP 地址的选项,如果主服务器出现故障,则不必重新启动它们。

如果 Nagios 检测到一个失败的 master,我仍然想参与到故障转移中来,包括告诉 HAproxy / PgBouncer 新的 master。

postgresql clustering

7
推荐指数
1
解决办法
4991
查看次数

PostgreSQL下加速IN查询的方法

我有以下形式的查询:

SELECT * FROM twitter_personas WHERE twitter_user_id IN ($1, $2, $3, ..., $25000)
Run Code Online (Sandbox Code Playgroud)

IN 查询有 10 到 25000 个值。查询一次运行几分钟。我有近 500,000 个这样的查询要运行。

twitter_user_id 列已编入索引。关于如何加快速度的任何想法?

# \d twitter_personas
                                    Table "public.twitter_personas"
      Column      |          Type          |                         Modifiers                          
------------------+------------------------+------------------------------------------------------------
 persona_id       | uuid                   | not null
 twitter_user_id  | bigint                 | 
 screen_name      | character varying(40)  | not null
 avatar_url       | text                   | 
 hashval          | integer                | not null default nextval('personas_hashval_seq'::regclass)
Indexes:
    "twitter_personas_pkey" PRIMARY KEY, btree (persona_id)
    "index_twitter_personas_on_screen_name" UNIQUE, btree (screen_name)
    "index_twitter_personas_on_screen_name_persona_id" btree (screen_name, persona_id)
    "index_twitter_personas_twitter_user_id" btree (twitter_user_id) …
Run Code Online (Sandbox Code Playgroud)

postgresql performance

6
推荐指数
1
解决办法
4806
查看次数

如何在 pg_dump 输出离开服务器之前对其进行匿名处理?

出于开发目的,我们将生产数据库转储到本地。这很好,因为数据库足够小。公司在成长,我们希望降低风险。为此,我们希望在数据离开数据库服务器之前对其进行匿名化处理。

我们想到的一种解决方案是在 pg_dump 之前运行语句,但在同一个事务中,如下所示:

BEGIN;
UPDATE users
SET email = 'dev+' || id || '@example.com'
  , password_hash = '/* hash of "password" */'
  , ...;
-- launch pg_dump as usual, ensuring a ROLLBACK at the end
-- pg_dump must run with the *same* connection, obviously

-- if not already done by pg_dump
ROLLBACK;
Run Code Online (Sandbox Code Playgroud)

是否有现成的解决方案?我们的数据库托管在 Heroku 上,我们在转储方式上没有 100% 的灵活性。

在下载和变体之前搜索了postgresql 匿名数据转储,但我没有看到任何高度相关的内容。

postgresql heroku pg-dump

5
推荐指数
1
解决办法
3469
查看次数

在 PostgreSQL 中存储位集?

我需要计算按不同标准分组的范围,并且希望将所有内容都保留在我的数据库中。我正在寻找 PostgreSQL 的预构建 bitset 实现,或者有关如何实现目标的指针。

我目前正在做的是将 EWAHCompressedBitSet 的序列化 Java 实例存储在 bytea 列中,但这意味着我必须往返于 Java 进程才能继续我的计算。

理想情况下,我希望能够执行以下操作:

-- Unique people reached during a time window
SELECT   service_name, last_updated_at, bitset_or(followers_bs)
FROM     followers
GROUP BY service_name, last_updated_at
Run Code Online (Sandbox Code Playgroud)

我使用了具有此类功能的商业解决方案(Truviso),它也是基于 PostgreSQL 的。

请注意,我确实有一个包含未压缩格式数据的表,但由于数据非常庞大(1000 万行并且还在计数),加入它所花费的时间比我想投入的时间要长。

postgresql

4
推荐指数
1
解决办法
1439
查看次数