标签: postgresql

PostgreSQL:从 psql 参数设置

按照这个关于限制 PostgreSQL 中每个查询的资源的答案,我被建议为查询执行设置超时值

SET statement_timeout TO '1min';
Run Code Online (Sandbox Code Playgroud)

这很好,但有时我想放宽对特定脚本的限制。

  • 有没有办法将超时设置为psql参数?我试过了psql --set statement_timeout=50,不成功。
  • 有没有办法从使用 psycopg2 的 Python 脚本中设置它?

postgresql performance ubuntu

8
推荐指数
1
解决办法
4626
查看次数

PostgreSQL:在同一查询中重用复杂的中间结果

使用PostgreSQL(8.4),我创建总结了几桌各种结果的视图(例如创建列abc在视图中),然后我需要一些结果结合在同一个查询(例如a+ba-b(a+b)/c, ...),从而产生最终结果。我注意到的是,每次使用中间结果时都会完全计算它们,即使它是在同一个查询中完成的。

有没有办法优化这个以避免每次都计算相同的结果?

这是一个重现问题的简化示例。

CREATE TABLE test1 (
    id SERIAL PRIMARY KEY,
    log_timestamp TIMESTAMP NOT NULL
);
CREATE TABLE test2 (
    test1_id INTEGER NOT NULL REFERENCES test1(id),
    category VARCHAR(10) NOT NULL,
    col1 INTEGER,
    col2 INTEGER
);
CREATE INDEX test_category_idx ON test2(category);

-- Added after edit to this question
CREATE INDEX test_id_idx ON test2(test1_id);

-- Populating with test data.
INSERT INTO test1(log_timestamp)
    SELECT * FROM generate_series('2011-01-01'::timestamp, '2012-01-01'::timestamp, '1 hour'); …
Run Code Online (Sandbox Code Playgroud)

postgresql performance

8
推荐指数
1
解决办法
3646
查看次数

PostgreSQL:在每个模式上执行 DDL

我有一个多租户数据库设置,需要添加一些列。我正在使用模式(和 search_path)来划分我的用户,所以我正在寻找一种普遍存在的方法来将 DDL 模式更改应用于我的所有数据库。最初,我认为我可以将其作为单个查询(pg_catalog 上的光标)来执行,但认为命令行调用psql -f可能是首选方式。

postgresql postgresql-9.2

8
推荐指数
2
解决办法
6410
查看次数

tsrange 上的 2 个 B 树索引或 1 个 GiST 索引——哪个性能更好?

我有一个表,它使用列存储预订数据starts_atends_at每当我查询表以查找重叠预订时,我都可以选择使用以下查询之一:

SELECT * FROM reservations
WHERE starts_at < '2014-01-03 00:00:00'
AND   ends_at   >='2014-01-01 00:00:00';
Run Code Online (Sandbox Code Playgroud)

或者

SELECT * FROM reservations
WHERE tsrange(starts_at, ends_at) && ('2014-01-01 00:00:00', '2014-01-03 00:00:00')
Run Code Online (Sandbox Code Playgroud)

我在starts_atends_at列上有常规的 B 树索引,因此第一个查询总是使用它们。但是,除非我在 tsrange 上定义功能性 GiST 索引,否则第二个查询会执行完整扫描。

create index tsrange_idx on reservations using gist(tsrange(starts_at, ends_at)); 
Run Code Online (Sandbox Code Playgroud)

我的问题是,随着表的增长,哪个索引会更快?查看查询执行计划,答案可能很明显,但我不精通读取EXPLAIN ANALYZE输出。

postgresql index index-tuning postgresql-9.2 gist-index

8
推荐指数
1
解决办法
3802
查看次数

将 hstore 键动态转换为一组未知键的列

我有一个数据库,它使用hstore. 为了将其合并到另一个不支持 的数据库中hstore,我想将键拆分为额外的列。

用户可以添加新的自定义字段,因此我不能提前依赖键的知识。这在“来自 hstore 列的属性作为视图中的单独列”给出了答案不适用于我的问题。

如果一条记录在其他记录中没有键,则它应该获得具有空值的同一列。

我该怎么做呢?

postgresql pivot dynamic-sql hstore

8
推荐指数
2
解决办法
5876
查看次数

移动大型 PostgreSQL/PostGIS 数据库

我需要将一个非常大(约 320 GB)的 PostGIS 数据库从server1(PostgreSQL 9.1,PostGIS 1.5)移动并升级到server2(PostgreSQL 9.3,PostGIS 2.1)。

升级过程有据可查。问题是我在server1上没有足够的空间将文件转储到那里,校验它,然后将它复制到server2并验证总和。我试过:

  • 从管道中转储服务器1Server2上使用nc
  • 直接写入转储文件到服务器2,其安装在文件系统server1的使用sshfs

两次转储文件似乎都已损坏。pg_restore在不同的地方打破了这样的错误:

pg_restore: [compress_io] could not uncompress data: incorrect data check

任何人都可以提出更好的方法来完成此移动和升级吗?

更新:尝试过 NFS(并再次尝试 SSHFS)。很明显,这些远程文件系统无法可靠地传输这么多数据。生成的 SQL 文件中明显缺少块,导致导入过程中出现如下语法错误:

ERROR:  invalid input syntax for integer: "8266UPDATE spatial_ref_sys o set auth_name = n.auth_name, auth_srid = n.auth_srid, srtext = n.srtext, proj4text = n.proj4text FROM _pgis_restore_spatial_ref_sys n …
Run Code Online (Sandbox Code Playgroud)

postgresql migration postgis

8
推荐指数
1
解决办法
1445
查看次数

如何防止登录在 PostgreSQL 中“列出”表或视图定义?

有没有办法防止登录列出架构中的表和列?

我必须授予对远程登录的访问权限才能在单个视图上进行查询;但是,我还必须确保此类登录不能列出该架构上的每个对象。

DENY VIEW ANY DEFINITION TO public;PostgreSQL 上有类似 MS SQL SERVER 的东西吗?

postgresql authentication security authorization permissions

8
推荐指数
1
解决办法
6793
查看次数

在`pg_hba.conf` 中使用主机名?

根据 PostgreSQL 文档:

以点 (.) 开头的主机名规范与实际主机名的后缀匹配。所以 .example.com 将匹配 foo.example.com(但不仅仅是 example.com)。

所以我把这一行放进去pg_hba.conf并重新启动 PostgreSQL:

hostssl market_data market_data_access .horsholm.dk md5
Run Code Online (Sandbox Code Playgroud)

然后我尝试连接到数据库:

psql "postgresql://market_data_access@<server-IP>:5433/market_data?sslmode=require"
Run Code Online (Sandbox Code Playgroud)

我得到了这个,而不是密码提示:

psql: FATAL:  no pg_hba.conf entry for host "195.249.206.131", user "market_data_access", database "market_data", SSL on
Run Code Online (Sandbox Code Playgroud)

为了检查,我对错误消息中列出的 IP 地址进行反向 DNS 查找:

$ host 195.249.206.131
131.206.249.195.in-addr.arpa is an alias for 131.129-190.206.249.195.in-addr.arpa.
131.129-190.206.249.195.in-addr.arpa domain name pointer kommune.horsholm.dk.
$
Run Code Online (Sandbox Code Playgroud)

我究竟做错了什么?

postgresql authentication postgresql-9.6

8
推荐指数
1
解决办法
4483
查看次数

将哪个数据模型/模式应用于具有不同字段的数据源的时间序列数据存储

我被要求为时间序列数据开发数据存储,尽管进行了大量研究,但我不确定要选择的数据模型和存储技术。

关于数据

要存储在数据存储器中的源数据由物理测量单元提供。每个单元可能有也可能没有不同的变量子集,每个测量站有多达 300 个变量(例如燃料类型、燃料消耗、速度),而所有站的不同信号数量约为 1500。预先知道每个站的预期变量子集。但是,随着时间的推移,可能会向站点添加额外的传感器(随着时间的推移,可能需要更改架构)。所有站都以从 20Hz 到 0.2Hz 的不同速率提供数据。

此外,还有相当数量的元数据可供所有这些测量站使用,最终我们将拥有大约 500 个。

数据通常是批量输入的,而不是“实时”流。批次大小从每小时批次到每月批次不等。

关于查询

进行数据查询主要有两个原因,单测站数据的上报和统计分析,以及跨站比较。大约 80% 的查询与过去 30 天内输入的数据有关。查询每天进行,因此SELECT负载超过INSERT负载。

理想情况下查询像

SELECT var1, var2, ... varN FROM station_data WHERE station_id=X OR station_id=Y AND TIMESTAMP BETWEEN ... AND ...;
Run Code Online (Sandbox Code Playgroud)

非 SQL 专家可以轻松访问数据。此外,简单的基于时间的聚合算法应该是可能的(AVG、MAX 等 pp)。

现在的情况

目前,使用高度规范化的结构将数据存储在 PostgreSQL 数据库中,该数据库现在增长到大约 6TB,每个变量一个表。大约 1500 个数据表中的每一个都是这样的形式

(timestamp, station_id, value)
Run Code Online (Sandbox Code Playgroud)

索引(station_id), (station_id, timestamp), (timestamp)和唯一约束(station_id, timestamp, value)

这种结构需要大量的外部连接(最多 300 个外部连接),这使得数据检索变得繁琐且计算成本高。

研究

到目前为止,进行了以下考虑:

数据库技术

  1. 虽然 NoSQL 将提供所需的架构灵活性,但确保数据完整性、访问控制和元数据管理的工具似乎具有挑战性,并且内部不存在 NoSQL 经验。此外,阅读与此相关的评论和答案似乎有利于我们用例的 …

schema postgresql database-design time-series-database timescaledb

8
推荐指数
1
解决办法
294
查看次数

SELECT DISTINCT ON,按另一列排序

请考虑下表test

CREATE TABLE test(col1 int, col2 varchar, col3 date);
INSERT INTO test VALUES
  (1,'abc','2015-09-10')
, (1,'abc','2015-09-11')
, (2,'xyz','2015-09-12')
, (2,'xyz','2015-09-13')
, (3,'tcs','2015-01-15')
, (3,'tcs','2015-01-18');
Run Code Online (Sandbox Code Playgroud)
postgres=# select * from test;
  col1 | col2 |    col3    
 ------+------+------------
     1 | abc  | 2015-09-10
     1 | abc  | 2015-09-11
     2 | xyz  | 2015-09-12
     2 | xyz  | 2015-09-13
     3 | tcs  | 2015-01-15
     3 | tcs  | 2015-01-18
Run Code Online (Sandbox Code Playgroud)

我想要一个按日期 desc 排序的返回集合:

 col1 | col2 |    col3    
------+------+------------
    2 | xyz  | …
Run Code Online (Sandbox Code Playgroud)

postgresql order-by greatest-n-per-group distinct postgresql-9.6

8
推荐指数
2
解决办法
3867
查看次数