在 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)
但我收到此错误:
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.
在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
在 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 中做任何事情。)
一些想法:
基本上有很多事情要尝试,但我们不确定什么是最有效的,或者我们是否忽略了其他事情。我们将在接下来的几天里进行实验,但我们想我们也会在这里问。
我确实在表上有并发负载,但它是只读的。
我们在 Postgres 中有一个 2.2 GB 的表,其中有 7,801,611 行。我们正在向它添加一个 uuid/guid 列,我想知道填充该列的最佳方法是什么(因为我们想NOT NULL向它添加约束)。
如果我正确理解 Postgres,更新在技术上是删除和插入,所以这基本上是重建整个 2.2 gb 表。我们还有一个奴隶在运行,所以我们不希望它落后。
有没有比编写一个随着时间慢慢填充它的脚本更好的方法?
我们正在设计一个众所周知的读取量大的系统(每分钟读取数万次)。
names作为一种中央注册表。每行都有一个text字段representation和一个唯一的字段,key它是该字段的 MD5 哈希值representation。1该表目前有数千万条记录,预计在应用程序的生命周期内会增长到数十亿条。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_keyhex(32)bit(128)BTREEGIN
我正在将旧的基于 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,但这只是我的代码中进行的更大的数学系统中的一个小例子,其中有数十个更复杂的数学位相互叠加。我宁愿尽可能干净地做而不重复自己。
我有一个查询,如:
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 对象。我想避免这种情况并保留原始列名。
用于添加新数据库连接的 pgAdmin 对话框要求“维护数据库”。
为了能够连接,我将它设置为我想要连接的数据库(而且,我有连接的权限)。
那么,为什么它被命名为“维护数据库”而不是“数据库”或“数据库”?。
我注意到查询子句中的USING构造(而不是ON)可能会在某些情况下引入优化障碍。FROMSELECT
我的意思是这个关键词:
选择 * 从一个 加入 b使用(a_id)
只是在更复杂的情况下。
上下文:this comment to this question。
我用这个了很多,从来没有发现过这么远。我会对展示效果的测试用例或任何指向更多信息的链接非常感兴趣。我的搜索努力是空的。
完美的答案将是一个测试用例,USING (a_id)与替代 join 子句相比,它的性能较差ON a.a_id = b.a_id——如果这真的可以发生的话。
我在 Ubuntu 上使用 PostgreSQL 9.1。VACUUM ANALYZE仍然推荐预定,还是 autovacuum 足以满足所有需求?
如果答案是“视情况而定”,那么:
我问是因为预定的时间VACUUM ANALYZE会影响我的报告。它运行了 5 个多小时,本周我不得不杀死它两次,因为它影响了常规的数据库导入。check_postgres不会报告数据库有任何显着膨胀,所以这不是真正的问题。
从文档中,autovacuum 也应该处理事务 ID 环绕。问题是:我还需要一个VACUUM ANALYZE吗?
这很简单,但我对 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 ×10
performance ×2
select ×2
bulk ×1
concurrency ×1
constraint ×1
datatypes ×1
ddl ×1
etl ×1
gist-index ×1
group-by ×1
index ×1
installation ×1
join ×1
json ×1
locking ×1
optimization ×1
pgadmin ×1
row ×1
storage ×1
update ×1
vacuum ×1