我对数据库进行基准测试以找出最适合我的项目的数据库,我发现这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) 有什么区别:
vacuum;
Run Code Online (Sandbox Code Playgroud)
和
vacuum analyze;
Run Code Online (Sandbox Code Playgroud)
我阅读了postgresql手册,但这对我来说仍然不是 100% 清楚。
我需要同时运行两者,还是其中一个就足够了?
我正在尝试从 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) 考虑我有两个表Employee和Department下面给出的字段:
员工:
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) 问题:某个应用程序的用户执行一个涉及大量 sql 查询的报告。几分钟后,用户退出应用程序(或者更糟糕的是,应用程序崩溃,或者与数据库服务器的连接丢失)。然而,查询会继续执行,即使不再需要它。
所以我已经阅读了这些类型的情况以及如何处理它们,并且建议使用TCP Keepalive 配置。
问题是看起来 postgres 忽略了这个配置。我在“postgres 级别”和“操作系统级别”都降低了原始配置值,但没有运气:
我什至尝试重新加载/重新启动 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) 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) 我想WITH在多个查询中使用相同的。
WITH x AS (INSERT ... RETURNING id)
INSERT INTO t2 VALUES (x);
INSERT INTO t3 VALUES (x);
Run Code Online (Sandbox Code Playgroud)
我该怎么做?我是否必须创建一个临时表?
我有一个在 ubuntu 服务器上运行的 postgres 9.3 db。
大约一个月前,我们的 VPS 托管公司解决了服务器上的硬件问题。
问题很快得到解决,一切似乎都运行良好。
我们使用另一台服务器上的酒保运行备份 - 备份和恢复工作正常(我检查过)。
数据损坏的第一个迹象是几天前:我决定在我们的数据库上做一个完整的 pg_dump,就像我每隔一段时间做的那样,它失败了(块中的页头无效......) - 数据似乎已经很久以前就损坏了 - 大约在硬件问题发生的时候(那是损坏记录上的日期)。我求助于查找损坏的记录,然后将其删除并手动恢复。
在那之后,我能够做一个完整的 pg_dump。
为了检查其他损坏 - 我从备份中设置了不同的数据库服务器并对所有表运行 pg_repack 以验证我能够重建所有索引和表。
我的问题是:
1. 我如何确定我的数据库中没有任何额外的损坏?
2. 如何定期检查我的数据完整性?
3. 除了转储整个数据库并重新索引它(我已经这样做了)之外,我还能做些什么来验证我们数据库的完整性?
PS - 我没有启用块校验和。
我们正在尝试使用这些数字和查询要求来优化数据库的性能:
有了这些必要条件,我们就得出了这个解决方案(有一个很大的缺点,解释如下)。
[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]表:
pg_partman)进行分区。每个分区是一个月解释[B]表:
有一个后端进程详细说明了网络。
它每 3 分钟插入或更新每个段的状态。
换句话说,此过程将在一天开始时插入新行,并将每 3 分钟更新一次内部数组。
该解决方案的优点 …
当我在 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 ×10
bytea ×1
corruption ×1
count ×1
export ×1
foreign-key ×1
insert ×1
kill ×1
mysql ×1
performance ×1
tcpip ×1