小编Erw*_*ter的帖子

PostgreSQL EXCLUDE USING 错误:数据类型整数没有默认操作符类

在 PostgreSQL 9.2.3 我试图创建这个简化的表:

CREATE TABLE test (
    user_id INTEGER,
    startend TSTZRANGE,
    EXCLUDE USING gist (user_id WITH =, startend WITH &&)
);
Run Code Online (Sandbox Code Playgroud)

但我收到此错误:

ERROR:  data type integer has no default operator class for access method "gist"
HINT:  You must specify an operator class for the index or define
       a default operator class for the data type.
Run Code Online (Sandbox Code Playgroud)

PostgreSQL的文档使用这个例子不为我工作:

CREATE TABLE room_reservation (
    room text,
    during tsrange,
    EXCLUDE USING gist (room WITH =, during WITH &&)
);
Run Code Online (Sandbox Code Playgroud)

同样的错误信息。

而这个对我来说也不起作用: …

postgresql constraint installation exclusion-constraint gist-index

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

优化 PostgreSQL 中的批量更新性能

在 Ubuntu 12.04 上使用 PG 9.1。

目前,我们在数据库上运行大量 UPDATE 语句最多需要 24 小时,它们的形式如下:

UPDATE table
SET field1 = constant1, field2 = constant2, ...
WHERE id = constid
Run Code Online (Sandbox Code Playgroud)

(我们只是覆盖由 ID 标识的对象的字段。)这些值来自外部数据源(尚未在数据库中的表中)。

每个表都有几个索引,没有外键约束。直到最后都没有提交。

导入pg_dump整个数据库的一个需要 2 小时。这似乎是我们应该合理定位的基线。

除了生成以某种方式重建数据集以供 PostgreSQL 重新导入的自定义程序之外,我们是否可以做些什么来使批量 UPDATE 性能更接近导入的性能?(这是一个我们认为日志结构合并树处理得很好的领域,但我们想知道是否可以在 PostgreSQL 中做任何事情。)

一些想法:

  • 删除所有非 ID 索引然后重建?
  • 增加 checkpoint_segments,但这真的有助于维持长期吞吐量吗?
  • 使用这里提到的技术?(将新数据加载为表,然后“合并”在新数据中找不到 ID 的旧数据)

基本上有很多事情要尝试,但我们不确定什么是最有效的,或者我们是否忽略了其他事情。我们将在接下来的几天里进行实验,但我们想我们也会在这里问。

我确实在表上有并发负载,但它是只读的。

postgresql performance bulk update

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

在大表中填充新列的最佳方法?

我们在 Postgres 中有一个 2.2 GB 的表,其中有 7,801,611 行。我们正在向它添加一个 uuid/guid 列,我想知道填充该列的最佳方法是什么(因为我们想NOT NULL向它添加约束)。

如果我正确理解 Postgres,更新在技术上是删除和插入,所以这基本上是重建整个 2.2 gb 表。我们还有一个奴隶在运行,所以我们不希望它落后。

有没有比编写一个随着时间慢慢填充它的脚本更好的方法?

postgresql storage ddl

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

MD5 字段的最佳数据类型是什么?

我们正在设计一个众所周知的读取量大的系统(每分钟读取数万次)。

  • 有一个表names作为一种中央注册表。每行都有一个text字段representation和一个唯一的字段,key它是该字段的 MD5 哈希值representation1该表目前有数千万条记录,预计在应用程序的生命周期内会增长到数十亿条。
  • 还有许多其他表(具有高度变化的模式和记录计数)引用该names表。这些表之一中的任何给定记录都保证有一个name_key,它在功能上是names表的外键。

1:顺便说一句,正如您所料,此表中的记录一旦写入便不可变。

对于表以外的任何给定表names,最常见的查询将遵循以下模式:

SELECT list, of, fields 
FROM table 
WHERE name_key IN (md5a, md5b, md5c...);
Run Code Online (Sandbox Code Playgroud)

我想优化读取性能。我怀疑我的第一站应该是最小化索引的大小(尽管我不介意在那里被证明是错误的)。

问题:和列
的最佳数据类型是什么? 有理由使用over吗?或者?keyname_key
hex(32)bit(128)BTREEGIN

postgresql index database-design uniqueidentifier datatypes

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

在同一个 SELECT 列表中引用列别名

我正在将旧的基于 MS-Access 的系统转换为 PostgreSQL。在 Access 中,由 SELECT 组成的字段可以用作后面字段的等式的一部分,如下所示:

SELECT
    samples.id,
    samples.wet_weight / samples.dry_weight - 1 AS percent_water,
    100 * percent_water AS percent_water_100
FROM samples;
Run Code Online (Sandbox Code Playgroud)

当我在 PostgreSQL 中这样做时,Postgres 抛出一个错误:

错误:“percent_water”列不存在。

通过从子选择中进行选择,我可以通过以下方式解决此问题:

SELECT
    s1.id,
    s1.percent_water,
    100 * s1.percent_water AS percent_water_100
FROM (
    SELECT
        samples.id,
        samples.wet_weight / samples.dry_weight - 1 AS percent_water
    FROM samples
    ) s1;
Run Code Online (Sandbox Code Playgroud)

有没有像第一个代码块那样的快捷方式来绕过复杂的嵌套?我也可以说100 * (samples.wet_weight / samples.dry_weight - 1) AS percent_water_100,但这只是我的代码中进行的更大的数学系统中的一个小例子,其中有数十个更复杂的数学位相互叠加。我宁愿尽可能干净地做而不重复自己。

postgresql select

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

选择 json_agg 中的列

我有一个查询,如:

SELECT a.id, a.name, json_agg(b.*) as "item"
  FROM a
  JOIN b ON b.item_id = a.id
 GROUP BY a.id, a.name;
Run Code Online (Sandbox Code Playgroud)

如何选择在列b,所以我没有b.item_id在JSON对象?

我读过关于ROW,但它返回一个 JSON 对象,如:

{"f1": "Foo", "f2": "Bar"}
Run Code Online (Sandbox Code Playgroud)

一旦获取它以匹配正确的列键,我将需要重新映射 JSON 对象。我想避免这种情况并保留原始列名。

postgresql group-by row json

41
推荐指数
4
解决办法
10万
查看次数

pgAdmin 询问的维护数据库是什么?

用于添加新数据库连接的 pgAdmin 对话框要求“维护数据库”
为了能够连接,我将它设置为我想要连接的数据库(而且,我有连接的权限)。

那么,为什么它被命名为“维护数据库”而不是“数据库”或“数据库”?。

postgresql pgadmin

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

在某些情况下,JOIN 子句中的 USING 构造会引入优化障碍吗?

我注意到查询子句中USING构造(而不是ON)可能会在某些情况下引入优化障碍。FROMSELECT

我的意思是这个关键词:

选择 *
从一个
加入 b使用(a_id)

只是在更复杂的情况下。

上下文:this comment to this question

我用这个了很多,从来没有发现过这么远。我会对展示效果的测试用例或任何指向更多信息的链接非常感兴趣。我的搜索努力是空的。

完美的答案将是一个测试用例,USING (a_id)与替代 join 子句相比,它的性能较差ON a.a_id = b.a_id——如果这真的可以发生的话。

postgresql performance join optimization select

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

在 9.1 下仍然推荐常规的 VACUUM ANALYZE 吗?

我在 Ubuntu 上使用 PostgreSQL 9.1。VACUUM ANALYZE仍然推荐预定,还是 autovacuum 足以满足所有需求?

如果答案是“视情况而定”,那么:

  • 我有一个较大的数据库(30 GiB 压缩转储大小,200 GiB 数据目录)
  • 我对数据库做 ETL,每周导入接近 300 万行
  • 变化最频繁的表全部继承自一个主表,主表中没有数据(数据按周分区)
  • 我创建每小时汇总,并从那里创建每日、每周和每月报告

我问是因为预定的时间VACUUM ANALYZE会影响我的报告。它运行了 5 个多小时,本周我不得不杀死它两次,因为它影响了常规的数据库导入。check_postgres不会报告数据库有任何显着膨胀,所以这不是真正的问题。

从文档中,autovacuum 也应该处理事务 ID 环绕。问题是:我还需要一个VACUUM ANALYZE吗?

postgresql etl vacuum

38
推荐指数
3
解决办法
4万
查看次数

PostgreSQL 中并发 DELETE / INSERT 的锁定问题

这很简单,但我对 PG 所做的(v9.0)感到困惑。我们从一个简单的表开始:

CREATE TABLE test (id INT PRIMARY KEY);
Run Code Online (Sandbox Code Playgroud)

和几行:

INSERT INTO TEST VALUES (1);
INSERT INTO TEST VALUES (2);
Run Code Online (Sandbox Code Playgroud)

使用我最喜欢的 JDBC 查询工具 (ExecuteQuery),我将两个会话窗口连接到该表所在的数据库。它们都是事务性的(即 auto-commit=false)。我们称它们为 S1 和 S2。

每个相同的代码位:

1:DELETE FROM test WHERE id=1;
2:INSERT INTO test VALUES (1);
3:COMMIT;
Run Code Online (Sandbox Code Playgroud)

现在,以慢动作运行它,在窗口中一次执行一个。

S1-1 runs (1 row deleted)
S2-1 runs (but is blocked since S1 has a write lock)
S1-2 runs (1 row inserted)
S1-3 runs, releasing the write lock
S2-1 runs, now that it can get the lock. But reports …
Run Code Online (Sandbox Code Playgroud)

postgresql concurrency locking serialization

38
推荐指数
4
解决办法
3万
查看次数