标签: postgresql

Postgres 慢查询 - Autovacuum 频率

我们注意到最近几周我们平台的性能下降,所以我运行了以下命令:

select relname, last_vacuum, last_autovacuum, last_analyze, last_autoanalyze 
from pg_stat_user_tables 
where relname like 'core_%';
Run Code Online (Sandbox Code Playgroud)

并注意到我们的主桌已经一个多星期没有自动清扫了。所以上周我跑了:

vacuum analyse verbose TABLENAME
Run Code Online (Sandbox Code Playgroud)

这似乎有帮助,但我们现在又遇到了同样的问题。仔细检查后,很多表要么从未被分析过(自动或其他方式),除了vacuum analyse上周手动运行之外,没有一个表被手动清理过,而且很多其他表也没有被自动清理过,充其量是几天前,更糟的是几周前。

我对条款的理解如下:

  • 真空:从磁盘中清除已删除的记录
  • 分析:更新查询规划器

在 中postgres.conf,autovacuum 属性被注释掉了,但是文档指出这是默认打开的,所以我的假设是即使它被注释掉了,它仍然应该打开吗?

有人可以解释为什么这些表不会被频繁地清理和分析,更具体地说,这些没有更新的值实际上对系统有那么大的影响吗?

信息:Postgres 9.1 操作系统:Ubuntu 12.04

输出

SELECT relname as "Table",
pg_size_pretty(pg_total_relation_size(relid)) As "Size",
pg_size_pretty(pg_total_relation_size(relid) - pg_relation_size(relid)) as "External Size"
FROM pg_catalog.pg_statio_user_tables 
ORDER BY pg_total_relation_size(relid) DESC;


     Table       | Size | External Size
-----------------+------+---------------
"Primary Table"  | 27G  |     8232M
Run Code Online (Sandbox Code Playgroud)

postgresql performance postgresql-9.1 postgresql-performance

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

Postgresql 转储中“SET default_with_oids = true”的相关性是什么?

我有一个来自旧数据库的 SQL 备份,该数据库可能是我正在导入的 PostgreSQL 7 或 8 数据库,其中包含一个SET default_with_oids - true语句,到现有的 8.4 数据库中,并想知道相关性是什么以及它可能如何影响现有数据库。

我不认为原始数据库中实际使用了 OID。我可以简单地忽略它吗?

postgresql postgresql-8.4

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

如何使用不区分大小写的排序规则创建 Postgres 数据库

我在 Windows 7 64 位上使用 postgres 9.4.1 64 位版本。我需要使用设置“区分大小写 = OFF”来创建数据库,但无法完成这项工作。我已经在 SO 和其他论坛上提出了很多问题,但即使在尝试了所有这些选项之后,我的数据库仍然区分大小写,我的搜索查询仅返回部分结果。

有没有人成功地在 Windows 环境中完成这项工作?

注意:我知道 ILIKE 运算符,但架构师团队不会考虑该选项,因为我们有明确的要求,即默认情况下数据库存储应为 CASE INSENSITIVE。我们没有任何需要区分大小写搜索的场景。

在此处输入图片说明

在此处输入图片说明

postgresql collation postgresql-9.4

5
推荐指数
2
解决办法
2万
查看次数

删除重复的记录,中间没有变化

我有一个产品表,我每天在其中插入大约 150,000 条记录。它们中的大多数都是多余的,但由于新的到期日期,我需要保留它们。我每天从 30 个供应商中的大约 5 个那里获得产品提要。每个供应商都有大约 35,000 种独特的产品。任何产品都不能属于多个供应商。

创建表 vendor_prices (
  id 序列主键,
  供应商整数非空,
  sku 字符变化 (25) NOT NULL,
  category_name 字符变化(100)非空,
  价格数字(8,5)非空,
  没有时区的有效日期时间戳,
  不带时区 DEFAULT 的 expire_date 时间戳(now() + '1 year'::interval)
);

我正在尝试删除没有价格变化且不再是该产品的最后更新的不相关记录,例如:

  生效日期价格
  '2015-05-01' $1.99 
  '2015-05-02' $1.99删除
  '2015-05-03' $1.59 
  '2015-05-04' $1.99 
  '2015-05-05' $1.99删除
  '2015-05-06' $1.99保留新的到期日期

所以每次加载后(我认为一次对一个供应商来说会更容易)我想做某种删除。这是我想出的长期无效的解决方案。

CREATE OR REPLACE FUNCTION remove_vendor_price_dupes(_vendor integer)
  RETURNS integer AS
$BODY$
BEGIN
    -- Delete Redundant prices
    delete from vendor_prices
    where id in (
      select id from (
        select vp1.id, vp1.vendor, …
Run Code Online (Sandbox Code Playgroud)

postgresql performance delete greatest-n-per-group postgresql-performance

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

Postgres 9.4,复制槽,不工作故障转移主

我已经通过本手册安装了 postgres 主节点和从节点:

在主 (10.0.0.1) 处

sudo -u postgres initdb -D /data/postgres/main
Run Code Online (Sandbox Code Playgroud)

更改 postgresql.conf:

listen_addresses = '*'
wal_level = hot_standby
max_wal_senders = 2
logging_collector = on
max_wal_senders = 5
Run Code Online (Sandbox Code Playgroud)

将复制记录添加到 pg_hba.conf:

host replication replica 10.0.0.2/32 md5
Run Code Online (Sandbox Code Playgroud)

然后启动postgres

service postgresql start
Run Code Online (Sandbox Code Playgroud)

创建复制用户:

CREATE USER replica WITH REPLICATION ENCRYPTED PASSWORD '123456';
Run Code Online (Sandbox Code Playgroud)

并添加复制槽:

SELECT pg_create_physical_replication_slot('standby_slot');
Run Code Online (Sandbox Code Playgroud)

在从站 (10.0.0.2)

pg_basebackup -h 10.0.0.1 -U replica -D /db/postgres/main -X s -P
Run Code Online (Sandbox Code Playgroud)

在 postgresql.conf 中将状态更改为备用:

hot_standby = on
Run Code Online (Sandbox Code Playgroud)

添加recovery.conf:

standby_mode = 'on'
primary_conninfo = 'host=10.0.0.1 port=5432 …
Run Code Online (Sandbox Code Playgroud)

postgresql replication failover

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

在 PostgreSQL 9.4 中推送或附加到 JSON 数组

我有一个表,其中一个字段是 JSON 数组。我需要将接收到的 JSON 数组附加到该字段中而不覆盖现有值。

类似的东西:

CREATE OR REPLACE FUNCTION add_array(
    array_received json[])
  RETURNS void AS
$BODY$

    update table set _array_field = _array_field | array_received ...;

$BODY$
  LANGUAGE plpgsql VOLATILE;
Run Code Online (Sandbox Code Playgroud)

postgresql array json postgresql-9.4

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

删除主键而不删除索引

是否可以在不删除索引的情况下删除表上的主键约束?我有一种情况,我想删除PRIMARY KEY以摆脱NOT NULL约束并将其设置为另一个列对。我想避免删除和重新创建索引。可以只PRIMARY KEY删除索引上的“属性”吗?删除约束会删除索引。

我使用的是 PostgreSQL 9.1 版。

postgresql index primary-key ddl

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

postgres \copy 文件到 RDS 超时

Postgres 9.3 版,托管在 Amazon RDS 上。我有一个messages包含 10G 数据的表。我psql在 EC2 上使用连接了数据库。然后用

\COPY (select * from messages) TO '/tmp/messages.csv' WITH (FORMAT CSV, FORCE_QUOTE *)
Run Code Online (Sandbox Code Playgroud)

将所有消息复制到 EC2 上的文件中。

然后我尝试将文件复制回表:

\COPY messages FROM '/tmp/messages.csv' WITH (FORMAT CSV)
Run Code Online (Sandbox Code Playgroud)

大约 5 分钟后,我总是收到此错误。这个messages.csv文件大约10G。

connection not open
The connection to the server was lost. Attempting reset: Succeeded.
Run Code Online (Sandbox Code Playgroud)

我尝试了一个愚蠢的解决方案,通过将文件拆分为多个较小的主干来减少输入数据的大小。即每个 400MB。

split -l 1000000 messages.csv messages_
Run Code Online (Sandbox Code Playgroud)

这会创建多个较小的文件,每个文件 400MB。这工作正常。

但是有没有我可以更改的配置来保持大文件的连接?

我尝试设置tcp_keepalives_idle=7200andtcp_keepalives_interval=7200tcp_keepalives_count=5,但连接在 10-15 分钟后仍然丢失。

postgresql copy

5
推荐指数
0
解决办法
2096
查看次数

使用 pg_statio_user_tables 的缓存命中率

我从这个博客中读到,您数据库中只有 20% 的数据获得了 80% 的大量读取。这意味着经常访问数据库中的一小部分数据。因此,您希望确保在缓存(主内存)而不是磁盘中访问 20%。最终,您希望缓存命中率达到 99%。博客提供了这个命令来查找缓存命中率:

SELECT 
  sum(heap_blks_read) as heap_read,
  sum(heap_blks_hit)  as heap_hit,
  sum(heap_blks_hit) / (sum(heap_blks_hit) + sum(heap_blks_read)) as ratio
FROM 
  pg_statio_user_tables;  
Run Code Online (Sandbox Code Playgroud)

好的,所以我期待接近 99% 的数字,但现在这是我得到的数字:

#   pg_statio_user_tables;
   heap_read   |   heap_hit    |         ratio          
---------------+---------------+------------------------
 2214811975866 | 1791164728361 | 0.44712310145763220493
(1 row)
Run Code Online (Sandbox Code Playgroud)

0.44?这甚至不接近 99%。这一定意味着大多数命中都发生在磁盘上,而缓存几乎不存在。什么可能导致这个问题?

postgresql

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

如何在现有安装上重新安装 PostgreSQL

我正在尝试升级使用 NSIS 创建的安装 postgresql 的安装程序。它曾经安装过 postgresql 8.3,但我们想将 DB 升级到 9.4.4。

DB 的旧版本曾经是 MSI 安装程序,但他们已切换到更高版本的 Windows EXE。旧版本能够安装在现有安装上。新版本中断并给我一个非常普遍的错误,我无法用它来查明问题。

错误:

安装目录必须是绝对路径,只能包含字母、数字和字符“-”、“/”、“.” 和'_',并且必须是可写的。

这是我的安装命令:

postgresql-9.4.4-1-windows-x64.exe --prefix "C:\postgres" --datadir "C:\postgres\data" --enable_acledit 1 --install_runtimes 0 --serverport 5432 --superpassword "XXXX " --servicepassword "XXXX" --unattendedmodeui minimum --mode unattended --debuglevel 0 --serviceaccount "postgres" --create_shortcuts 0

Bitrock 安装程序仅提供上述错误,没有路径详细信息或任何可操作的内容。

任何线索或建议?(谢谢)

postgresql postgresql-9.4

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