标签: postgresql

MySQL 与 PostgreSQL:对 COUNT(*) 执行速度进行基准测试

我对数据库进行基准测试以找出最适合我的项目的数据库,我发现这count(*)在 PostgeSQL 中非常慢。我不明白这是 PostgeSQL 的正常行为还是我做错了什么。

我有一个包含 ~200M 记录的表。MySQL表定义:

CREATE TABLE t1 (
  id int(11) NOT NULL AUTO_INCREMENT,
  t2_id int(11) NOT NULL,
....  
  PRIMARY KEY (id),
  KEY index_t2 (t2_id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
Run Code Online (Sandbox Code Playgroud)

请求(返回~30M):

SELECT COUNT(*) FROM t1 WHERE t2_id = 7;
Run Code Online (Sandbox Code Playgroud)

运行:

25,797ms MySQL (v5.7.11)

1,222,168ms PostgeSQL (v9.5)

解释:

MySQL:

*************************** 1. row ***************************
           id: 1
  select_type: SIMPLE
        table: t1
   partitions: NULL
         type: ref
possible_keys: index_t2
          key: index_t2
      key_len: 4
          ref: const
         rows: 59438630
     filtered: 100.00
        Extra: Using …
Run Code Online (Sandbox Code Playgroud)

mysql postgresql count

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

Postgresql 上的真空和真空分析之间的真正区别是什么?

有什么区别:

vacuum;
Run Code Online (Sandbox Code Playgroud)

vacuum analyze; 
Run Code Online (Sandbox Code Playgroud)

我阅读了postgresql手册,但这对我来说仍然不是 100% 清楚。

我需要同时运行两者,还是其中一个就足够了?

postgresql

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

从 bytea 列导出图像文件

我正在尝试从 PostgreSQL 数据库users_data_circulation中导出图像文件。该表有一个photo(bytea) 列。

我的命令:

copy (select encode(photo,'hex') from users_data_circulation limit 1)
    TO '/tmp/imagetest.hext';
Run Code Online (Sandbox Code Playgroud)

在操作系统中:

$> xxd -p -r /tmp/imagetest.hex > /tmp/imagetest.jpg
$> file /tmp/imagetest.jpg
/tmp/imagetest.jpg: ASCII TEXT
Run Code Online (Sandbox Code Playgroud)

我无法打开jpg文件。我怎样才能把这个文件转换成jpg?

devinim@devinimpostgresql:~$ hexdump -C /tmp/image.hex | more
00000000  5c 5c 33 37 37 5c 5c 33  33 30 5c 5c 33 37 37 5c  |\\377\\330\\377\|
00000010  5c 33 34 30 5c 5c 30 30  30 10 4a 46 49 46 5c 5c  |\340\\000.JFIF\\|
00000020  30 30 …
Run Code Online (Sandbox Code Playgroud)

postgresql export postgresql-9.3 bytea

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

插入数据违反外键约束

考虑我有两个表EmployeeDepartment下面给出的字段:

员工:

Fname、Minit、Lname、SsnBdate、地址、性别、薪水、Super_ssn、Dno

部门:

Dname, Dnumber, Mgr_ssn, Mgr_start_date

Italics and code block 表示表的主键。

在上述情况下,Super_Ssn引用SSN员工,而DNO引用该部的Dnumber。为它们创建 sql 非常简单,首先添加列,然后在形成两个表时更改它们。但是,在插入如下所示的数据时:

insert into employee values('James','E','Borg','888665555','1937-11-10','asda','M',55000,NULL,1);
ERROR:  insert or update on table "employee" violates foreign key constraint "dno_ref_dnum_dpt"
DETAIL:  Key (dno)=(1) is not present in table "department".
Run Code Online (Sandbox Code Playgroud)

insert into sp0090.department values ('Headquarter',1,'888665555','1981-06-19');
ERROR:  insert or update on table "department" violates foreign key constraint "department_mgr_ssn_fkey"
DETAIL:  Key (mgr_ssn)=(888665555) is not …
Run Code Online (Sandbox Code Playgroud)

postgresql foreign-key database-design insert

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

使用 TCP keepalive 终止孤立的 postgres 查询不起作用

问题:某个应用程序的用户执行一个涉及大量 sql 查询的报告。几分钟后,用户退出应用程序(或者更糟糕的是,应用程序崩溃,或者与数据库服务器的连接丢失)。然而,查询会继续执行,即使不再需要它

所以我已经阅读了这些类型的情况以及如何处理它们,并且建议使用TCP Keepalive 配置

问题是看起来 postgres 忽略了这个配置。我在“postgres 级别”和“操作系统级别”都降低了原始配置值,但没有运气:

  • 配置文件
    • tcp_keepalives_idle = 60
    • tcp_keepalives_interval = 6
    • tcp_keepalives_count = 10
  • Ubuntu
    • echo 60 > /proc/sys/net/ipv4/tcp_keepalive_time
    • 回声 10 > /proc/sys/net/ipv4/tcp_keepalive_intvl
    • 回声 6 > /proc/sys/net/ipv4/tcp_keepalive_probe

我什至尝试重新加载/重新启动 postgres 但没有任何效果,查询一直运行到最后两分钟。¿是否有任何额外的步骤我遗漏了?

编辑:pg_stat_activity 的结果:

  datid   |                  datname                   | procpid | usesysid | usename  |                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                          current_query                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                          | waiting |          xact_start           |          query_start          |         backend_start         | client_addr | client_port 
----------+--------------------------------------------+---------+----------+----------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+---------+-------------------------------+-------------------------------+-------------------------------+-------------+-------------
467061608 | libertya_prod_hts_rg1_20161004_qafuncional |   16716 |    16384 | libertya | SELECT dt.signo_issotrx, …
Run Code Online (Sandbox Code Playgroud)

postgresql postgresql-8.4 tcpip kill

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

禁止在公共模式中创建表

Postgres 版本:9.3.16

假设我们有两个用户,luser并且editor. 我想让它luser(或任何其他非超级用户)不能在公共模式下创建任何表,除了editor. 当我postgres用户身份应用以下内容时,我实现了这一点:

postgres=> select current_user;
 current_user
--------------
 postgres
(1 row)
postgres=# REVOKE ALL ON SCHEMA public FROM PUBLIC;
REVOKE
postgres=# GRANT ALL ON SCHEMA public TO editor WITH GRANT OPTION;
GRANT
postgres=# SET ROLE luser;
SET
postgres=> create table public.test (uid integer);
ERROR:  permission denied for schema public
postgres=> SET ROLE editor;
SET
postgres=> create table public.test (uid integer);
CREATE TABLE
postgres=> \d+
                   List of …
Run Code Online (Sandbox Code Playgroud)

postgresql

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

在多个查询中使用相同的 Postgres WITH

我想WITH在多个查询中使用相同的。

WITH x AS (INSERT ... RETURNING id)
INSERT INTO t2 VALUES (x);
INSERT INTO t3 VALUES (x);
Run Code Online (Sandbox Code Playgroud)

我该怎么做?我是否必须创建一个临时表?

postgresql

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

如何验证 postgres 9.3 db 没有损坏?

我有一个在 ubuntu 服务器上运行的 postgres 9.3 db。
大约一个月前,我们的 VPS 托管公司解决了服务器上的硬件问题。

问题很快得到解决,一切似乎都运行良好。
我们使用另一台服务器上的酒保运行备份 - 备份和恢复工作正常(我检查过)。

数据损坏的第一个迹象是几天前:我决定在我们的数据库上做一个完整的 pg_dump,就像我每隔一段时间做的那样,它失败了(块中的页头无效......) - 数据似乎已经很久以前就损坏了 - 大约在硬件问题发生的时候(那是损坏记录上的日期)。我求助于查找损坏的记录,然后将其删除并手动恢复。

在那之后,我能够做一个完整的 pg_dump。

为了检查其他损坏 - 我从备份中设置了不同的数据库服务器并对所有表运行 pg_repack 以验证我能够重建所有索引和表。

我的问题是:
1. 我如何确定我的数据库中没有任何额外的损坏?

2. 如何定期检查我的数据完整性?
3. 除了转储整个数据库并重新索引它(我已经这样做了)之外,我还能做些什么来验证我们数据库的完整性?

PS - 我没有启用块校验和。

postgresql corruption data-integrity postgresql-9.3

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

PostgreSQL - 设计数据库以避免频繁更新大型数据集

我们正在尝试使用这些数字和查询要求来优化数据库的性能:

  1. 200-400k 网段由唯一ID标识
  2. 每个网段都有一个状态,其动态属性数量有限(即平均速度)。动态属性的单个状态可以存储在 8 个字节中
  3. 段状态每 3 分钟改变一次,H24,7/7
  4. 是否可以查询特定日期范围内的一组段(有时是所有段)的状态或仅查询实际情况。
  5. 可以请求空间查询以查找特定日期(通常是“现在”)“我周围”的所有段

有了这些必要条件,我们就得出了这个解决方案(有一个很大的缺点,解释如下)。

[A] TABLE main_segments_history( 
      id_segment integer NOT NULL,
      day date NOT NULL,    
      day_slices bigint[],
      CONSTRAINT main_segments_history_pk PRIMARY KEY (id_segment,day)
)

[B] TABLE current_segment_release_state(
      id_segment integer NOT NULL,
      release_date timestamptz,
      ... all other attributes ...
      CONSTRAINT currsegm_release_state_pk PRIMARY KEY (id_segment,release_date)
)
Run Code Online (Sandbox Code Playgroud)

解释[A]表:

  1. 它在字段“day”上使用 partition_manager ( pg_partman)进行分区。每个分区是一个月
  2. day_slices 数组是一个 480 个元素的一维数组,表示全天每个 3 分钟切片的粒度

解释[B]表:

  1. 它只是每个段的当前发布状态

有一个后端进程详细说明了网络。
它每 3 分钟插入或更新每个段的状态。
换句话说,此过程将在一天开始时插入新行,并将每 3 分钟更新一次内部数组。

该解决方案的优点 …

postgresql performance database-design

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

不能在准备好的语句中插入多个命令

当我在 PG 管理查询工具中尝试时,此查询对我有用:

UPDATE bankdetails SET bank_details = 'mysore' ,"PAN"= 123,bank_acc = 456,
                       "UAN"=789,tax = 'myy'
WHERE  user_id = 79;
INSERT INTO bankdetails (user_id,bank_details,"PAN",bank_acc,"UAN",tax)
       SELECT 79,'mysore',123,456,789,'myy'
       WHERE NOT EXISTS (SELECT 1 FROM bankdetails WHERE user_id=79);
Run Code Online (Sandbox Code Playgroud)

后来我在我的代码中是这样实现的:

db.query('UPDATE bankdetails SET bank_details = $2 ,"PAN"= $3,bank_acc = $4,"UAN"=$5,tax = $6 WHERE user_id = $1; INSERT INTO bankdetails (user_id,bank_details,"PAN",bank_acc,"UAN",tax) SELECT $1,$2,$3,$4,$5,$6 WHERE NOT EXISTS (SELECT 1 FROM bankdetails WHERE user_id = $1);', [companyuser.rows[0]._id, data.bankDetails.bank_details, data.bankDetails.PAN, data.bankDetails.bank_acc, data.bankDetails.UAN, data.bankDetails.tax],function(err,bank) {

                if (err) return callback(new …
Run Code Online (Sandbox Code Playgroud)

postgresql postgresql-9.6

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