标签: postgresql

检查唯一列的值是否存在或让 db 在插入时引发唯一错误的优缺点

前几天在写一个查询时,一个想法出现在我的脑海中。

什么是可取的,首先检查是否存在唯一列的值,然后插入或插入并让 db 引发唯一约束错误?它甚至会重要吗?

编辑:正如下面在回答这个问题取决于数据库时所建议的那样,我正在添加标签 postgresql。

postgresql performance error-handling

9
推荐指数
2
解决办法
1365
查看次数

PostgreSQL下如何指定触发器执行顺序?

我正在使用触发器使用“经典”基于时间的分区。我发现需要一个单独的触发器,它在原始表上运行。

CREATE TABLE twitter_interactions(...);
CREATE OR REPLACE FUNCTION insert_twitter_interactions ...;
CREATE TRIGGER insert_twitter_interactions_trig
  BEFORE INSERT OR UPDATE on twitter_interactions
  FOR EACH ROW EXECUTE PROCEDURE insert_twitter_interactions();

CREATE OR REPLACE FUNCTION maintain_data_pointers ...;
CREATE TRIGGER maintain_data_pointers_trig
  BEFORE INSERT OR UPDATE on twitter_interactions
  FOR EACH ROW EXECUTE PROCEDURE insert_twitter_interactions();
Run Code Online (Sandbox Code Playgroud)

我还没有完全验证,但我怀疑分区逻辑在维护触发器之前运行,并且由于该行没有出现在父表中,因此第二个触发器永远不会触发。

如果我也想运行,会发生什么AFTER INSERT OR UPDATE?由于该行未将其放入原始表中,因此我无法实现 after 逻辑。

postgresql trigger

9
推荐指数
2
解决办法
9287
查看次数

部分数据库转储/恢复

我的数据库(PostgreSQL 9.3)的一部分依赖于额外的表(例如 County、City、Town...)。我不管理这些表,它们由第三方定期更新。每次我得到一个新的完整转储,但我很难将更改推回我的数据库。

我玩过 pg_dump / restore 并遇到了一些约束问题duplicate key value violates unique constraintcannot drop constraint ... because other objects depend on it甚至使用--disable-triggersor--clean选项。

有没有我错过的选项?我发现有一些方法可以打开/关闭约束,但我不知道这是解决这个问题的好方法还是只是一个肮脏的黑客?(我不是 DBA 专家。)老实说,我很惊讶没有简单的方法来实现这一目标。也许我已经错过了!我天真地认为我可以将 pg_restore 作为一个大事务运行并在脚本末尾检查约束。是否可以?

postgresql duplication restore

9
推荐指数
1
解决办法
4219
查看次数

为什么 SELECT 语句会在 Postgres 中脏缓存缓冲区?

EXPLAIN (ANALYZE, BUFFERS) SELECT ...在我的 Postgres 9.3 服务器上运行。我最终Buffers: shared hit=166416 dirtied=2在输出中看到了类似的东西。
从文档中,“脏”表示:

脏的块数表示此查询更改的先前未修改的块数;而写入的块数表示该后端在查询处理期间从缓存中逐出的先前脏块的数量。

这听起来像是将块标记为脏的过程应该只在更新数据时发生。SELECT但是,我的查询是,并且只读取数据。我想它只会报告点击或阅读。我显然错了。但是,在这种情况下到底发生了什么?

postgresql cache explain

9
推荐指数
1
解决办法
2133
查看次数

优化一系列时间戳的查询(一列)

我正在通过 Heroku 使用 Postgres 9.3。

我有一个表,“交通”,有 100 万条记录,每天都有很多插入和更新。我需要在不同的时间范围内跨该表执行 SUM 运算,这些调用最多可能需要 40 秒,我很想听听有关如何改进它的建议。

我在这张桌子上有以下索引:

CREATE INDEX idx_traffic_partner_only ON traffic (dt_created) WHERE campaign_id IS NULL AND uuid_self <> uuid_partner;
Run Code Online (Sandbox Code Playgroud)

这是一个示例 SELECT 语句:

SELECT SUM("clicks") AS clicks, SUM("impressions") AS impressions
FROM "traffic"
WHERE "uuid_self" != "uuid_partner"
AND "campaign_id" is NULL
AND "dt_created" >= 'Sun, 29 Mar 2015 00:00:00 +0000'
AND "dt_created" <= 'Mon, 27 Apr 2015 23:59:59 +0000' 
Run Code Online (Sandbox Code Playgroud)

这是解释分析:

Aggregate  (cost=21625.91..21625.92 rows=1 width=16) (actual time=41804.754..41804.754 rows=1 loops=1)
  ->  Index Scan using idx_traffic_partner_only on …
Run Code Online (Sandbox Code Playgroud)

postgresql performance index optimization postgresql-9.3 postgresql-performance

9
推荐指数
1
解决办法
5849
查看次数

尽快在 Postgres 表上创建索引

我在没有索引的 Postgres 表上有一个大型数据库导入(100GB)。

导入后,我想尽快为查询创建索引。只要索引未准备好,就不会访问表中的数据。

建立索引的最快方法是什么?我必须在 3 列(两列varchar,一列date)上建立索引。创建索引大约需要2个小时,这真的没有用。

有什么办法可以加快索引的创建吗?在数据导入之前设置索引可能不是更好,因为这会减慢导入速度?

我知道 Postgres 可以选择“不加锁”创建索引,但这不会降低性能,因为它使 Postgres 能够在创建索引时访问数据?

这是一个虚拟机。服务器的内存可以根据我的需要增加。目前我有32GB。work_mem并且maintenance_work_mem仍处于默认配置值。我没有用于数据库的 SSD。这肯定会加快速度吗?

我没有任何boolean可用于部分索引的标志或类似标志。事实上,我希望表中的每一行都被索引。

postgresql performance index configuration import

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

PostgreSQL 外部数据包装器上的外键(引用)约束?

似乎不允许向外部表添加外键约束。有没有其他方法可以做到这一点?我的两个表在远程服务器上有这些限制。


更具体的细节:

我真的只需要它作为注释,因为有些工具会查找 JOIN。

我在远程服务器上有两个表,我使用postgresql_fdw's将它们添加到本地CREATE FOREIGN TABLE。这些我在 PostgREST 中使用,自动 API 服务器使用 REFERENCES 信息进行连接。

实际上,我正在进一步增加两个CREATE MATERIALIZED VIEW以加快查找速度 - 但遗憾的是,他们也没有任何我知道的添加 REFERENCES 信息的方法?

我愿意使用其他方法在外部 API 服务器上快速(只读)查找这些表以及外键约束将在何处工作。

postgresql foreign-key remote postgresql-fdw

9
推荐指数
1
解决办法
2122
查看次数

选择每组至少一行满足条件的行

我有下表:

create table test (
  company_id integer not null, 
  client_id integer not null, 
  client_status text,
  unique (company_id, client_id)
);

insert into test values
  (1, 1, 'y'),    -- company1

  (2, 2, null),   -- company2

  (3, 3, 'n'),    -- company3

  (4, 4, 'y'),    -- company4
  (4, 5, 'n'),

  (5, 6, null),   -- company5
  (5, 7, 'n')
;
Run Code Online (Sandbox Code Playgroud)

基本上,有 5 家不同的公司,每家公司都有一个或多个客户,每个客户的状态为:“y”或“n”(也可能为空)。

我必须做的是为(company_id, client_id)至少有一个客户的状态不是“n”(“y”或 null)的所有公司选择所有对。所以对于上面的示例数据,输出应该是:

company_id;client_id
1;1
2;2
4;4
4;5
5;6
5;7
Run Code Online (Sandbox Code Playgroud)

我尝试了一些使用窗口函数的东西,但我无法弄清楚如何将所有客户端的数量与带有STATUS = 'n'.

select company_id,
count(*) over (partition …
Run Code Online (Sandbox Code Playgroud)

postgresql postgresql-9.4

9
推荐指数
1
解决办法
4万
查看次数

不能索引大于缓冲区页 1/3 的值

我对 DB 不太好,所以请多多包涵。

我试图将一个很长的 JSON 数据放入一个表中,该表是由 Django 框架创建的。

我在 Heroku 上使用 Postgres。因此,当我尝试放置数据时,出现以下错误:

File "/app/.heroku/python/lib/python3.6/site-packages/django/db/backends/utils.py", line 64, in execute
    return self.cursor.execute(sql, params)
psycopg2.OperationalError: index row size 3496 exceeds maximum 2712 for index "editor_contentmodel_content_2192f49c_uniq"
HINT:  Values larger than 1/3 of a buffer page cannot be indexed.
Consider a function index of an MD5 hash of the value, or use full text indexing.
Run Code Online (Sandbox Code Playgroud)

我的数据库和表看起来像这样:

gollahalli-me-django-test::DATABASE=> \dt
                      List of relations
 Schema |            Name            | Type  |     Owner
--------+----------------------------+-------+----------------
 public | auth_group                 | table | …
Run Code Online (Sandbox Code Playgroud)

postgresql

9
推荐指数
1
解决办法
7703
查看次数

pg_trigger_depth() 用于防止触发器级联(递归)是否不好?

为什么pg_trigger_depth() = 0在防止触发器级联(递归)时使用(除调试之外的)不好?

有人可以提供代码来证明它为什么不好吗?

我猜测是因为如果多个触发器同时处理相同的数据,则停止使用触发器的条件pg_trigger_depth() = 0将停止任何排在第二位的触发器。

我认为这将是解决这个(我的)问题的好方法,但有人告诉我:

认为这会是一个很好的问题。

它在此处作为解决方案提供:

Postgres 9.3 文档:

https://www.postgresql.org/docs/9.3/static/functions-info.html

postgresql trigger

9
推荐指数
2
解决办法
4178
查看次数