按照这个关于限制 PostgreSQL 中每个查询的资源的答案,我被建议为查询执行设置超时值:
SET statement_timeout TO '1min';
Run Code Online (Sandbox Code Playgroud)
这很好,但有时我想放宽对特定脚本的限制。
psql参数?我试过了psql --set statement_timeout=50,不成功。使用PostgreSQL(8.4),我创建总结了几桌各种结果的视图(例如创建列a,b,c在视图中),然后我需要一些结果结合在同一个查询(例如a+b,a-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) 我有一个多租户数据库设置,需要添加一些列。我正在使用模式(和 search_path)来划分我的用户,所以我正在寻找一种普遍存在的方法来将 DDL 模式更改应用于我的所有数据库。最初,我认为我可以将其作为单个查询(pg_catalog 上的光标)来执行,但认为命令行调用psql -f可能是首选方式。
我有一个表,它使用列存储预订数据starts_at,ends_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_at和ends_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输出。
我有一个数据库,它使用hstore. 为了将其合并到另一个不支持 的数据库中hstore,我想将键拆分为额外的列。
用户可以添加新的自定义字段,因此我不能提前依赖键的知识。这在“来自 hstore 列的属性作为视图中的单独列”给出了答案?不适用于我的问题。
如果一条记录在其他记录中没有键,则它应该获得具有空值的同一列。
我该怎么做呢?
我需要将一个非常大(约 320 GB)的 PostGIS 数据库从server1(PostgreSQL 9.1,PostGIS 1.5)移动并升级到server2(PostgreSQL 9.3,PostGIS 2.1)。
升级过程有据可查。问题是我在server1上没有足够的空间将文件转储到那里,校验它,然后将它复制到server2并验证总和。我试过:
nc。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) 有没有办法防止登录列出架构中的表和列?
我必须授予对远程登录的访问权限才能在单个视图上进行查询;但是,我还必须确保此类登录不能列出该架构上的每个对象。
DENY VIEW ANY DEFINITION TO public;PostgreSQL 上有类似 MS SQL SERVER 的东西吗?
postgresql authentication security authorization permissions
根据 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)
我究竟做错了什么?
我被要求为时间序列数据开发数据存储,尽管进行了大量研究,但我不确定要选择的数据模型和存储技术。
要存储在数据存储器中的源数据由物理测量单元提供。每个单元可能有也可能没有不同的变量子集,每个测量站有多达 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 个外部连接),这使得数据检索变得繁琐且计算成本高。
到目前为止,进行了以下考虑:
schema postgresql database-design time-series-database timescaledb
请考虑下表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
postgresql ×10
performance ×2
distinct ×1
dynamic-sql ×1
gist-index ×1
hstore ×1
index ×1
index-tuning ×1
migration ×1
order-by ×1
permissions ×1
pivot ×1
postgis ×1
schema ×1
security ×1
timescaledb ×1
ubuntu ×1