我在 Ubuntu 上使用 PostgreSQL 9.1。VACUUM ANALYZE
仍然推荐预定,还是 autovacuum 足以满足所有需求?
如果答案是“视情况而定”,那么:
我问是因为预定的时间VACUUM ANALYZE
会影响我的报告。它运行了 5 个多小时,本周我不得不杀死它两次,因为它影响了常规的数据库导入。check_postgres
不会报告数据库有任何显着膨胀,所以这不是真正的问题。
从文档中,autovacuum 也应该处理事务 ID 环绕。问题是:我还需要一个VACUUM ANALYZE
吗?
我的数据库中已经有几百万行了。我在设计模式时不知道 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) 我正在编写一个验证触发器。触发器必须验证数组的总和是否等于另一个字段。由于我有许多此验证的实例,因此我想编写一个过程并创建多个触发器,每个触发器都有一组不同的要检查的字段。
例如,我有以下架构:
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) 我正在使用触发器使用“经典”基于时间的分区。我发现需要一个单独的触发器,它在原始表上运行。
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 逻辑。
我有一个更新汇总表的大型 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) 使用一个比另一个有什么优势吗?我只是在寻找从我的进程中隐藏主服务器和从服务器的实际 IP 地址的选项,如果主服务器出现故障,则不必重新启动它们。
如果 Nagios 检测到一个失败的 master,我仍然想参与到故障转移中来,包括告诉 HAproxy / PgBouncer 新的 master。
我有以下形式的查询:
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) 出于开发目的,我们将生产数据库转储到本地。这很好,因为数据库足够小。公司在成长,我们希望降低风险。为此,我们希望在数据离开数据库服务器之前对其进行匿名化处理。
我们想到的一种解决方案是在 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 的预构建 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 ×9
trigger ×2
clustering ×1
etl ×1
heroku ×1
performance ×1
pg-dump ×1
plpgsql ×1
vacuum ×1