标签: postgresql

具有最大和最小日期以及每行关联 ID 的 PostgreSQL 查询

我有下表:

CREATE TABLE trans (
    id SERIAL PRIMARY KEY,
    trans_date date,
    trans_time time        
);
Run Code Online (Sandbox Code Playgroud)

我想有以下观点

CREATE OR REPLACE VIEW daily_trans AS
SELECT trans_date,
    max(trans_time) as first, 
    min(trans_time) as last,
    calculate_status(min(trans_time), max(trans_time)) as status 
GROUP BY trans_date 
Run Code Online (Sandbox Code Playgroud)

带有指定最大和最小 trans_time id 的列。

我怎么做?

postgresql aggregate window-functions

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

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

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

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

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

postgresql performance error-handling

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

Postgresql 多列 GIN 索引

假设一个items像这样的 postgresql 表。(keywords列是类型text[]

name   account_id      keywords
------------------------------
foo1   1               ['k1', 'k2']
foo2   1               ['k1', 'k3']
foo3   2               ['k4', 'k1']
foo4   2               ['k1', 'k6']
Run Code Online (Sandbox Code Playgroud)

items 中的每一行都与 a 相关Account(该表由 account_id 虚拟拆分)。我们希望进行如下查询:“带有关键字 k1 的帐户 1 的项目”。此查询需要在account_idkeywords列上使用复合 GIN 索引。

实际上,我们需要一个倒排索引,行是这样的:(每行的键应该是复合的)

(account_id, keyword) --> [item1, item2, ...]

在 postgresql 中创建此索引的正确方法是什么?

postgresql gin-index

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

部分数据库转储/恢复

我的数据库(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
查看次数

不能索引大于缓冲区页 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
查看次数

仅获取具有最大组值的行

例如,我们有:

element | group_value | value
a       | 1           | 2000
a       | 2           | 1500
a       | 2           | 2500
b       | 1           | 1000
Run Code Online (Sandbox Code Playgroud)

我只想返回最后 3 条记录,因为这些记录是每个元素具有最大组值的记录。

我知道有一个带有子查询的解决方案,但有没有一个有效的解决方案?

澄清:对于元素“a”:

2 是最高的 group_value,因此它返回第 2 行和第 3 行>(而不是第一行,因为它的组值不是最高的),

对于元素“b”:

1 是 > 最高的 group_value 所以它返回第 4 行

我的(性能不好)解决问题的方法是:

select * 
from   x x1 
where (element, group_value) in (select   element, max(group_value) 
                                 from     x x2 
                                 where    x1.element = x2.element 
                                 group by x2.element)
Run Code Online (Sandbox Code Playgroud)

postgresql group-by greatest-n-per-group

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

了解 SELECT 列表中的集合返回函数 (SRF)

为什么在 SELECT 列表中使用 Set Returning Function (SRF) 与在 FROM 子句中使用 SRF 在行为上存在差异?

例如,对于返回 2 行的简单 SRF:

CREATE OR REPLACE FUNCTION gen_series(out integer, out int)
  RETURNS SETOF record AS $$
  SELECT 1,1
  UNION
  SELECT 2,2;
$$ LANGUAGE SQL;
Run Code Online (Sandbox Code Playgroud)

SELECT gen_series(); 返回两个单列行,每个行包含一条记录:

=>  gen_series 
------------
 (1,1)
 (2,2)
(2 rows)
Run Code Online (Sandbox Code Playgroud)

SELECT * FROM gen_series();返回扩展记录的两行:

=>  column1 | column2 
---------+---------
       1 |       1
       2 |       2
(2 rows)
Run Code Online (Sandbox Code Playgroud)

相比之下,如果 SRF 返回单个列,则在 SELECT 或 FROM 子句中调用 SRF 没有区别。例如:

=> SELECT generate_series(1,2);
 generate_series 
----------------- …
Run Code Online (Sandbox Code Playgroud)

postgresql set-returning-functions

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

多列索引和 OR 子句

我的message应用程序中有一个表,该表上最常执行的 SQL 查询之一如下:

select * from message message0_ 
 where message0_.sender_id=? or message0_.recipient_id=?
 order by message0_.send_date asc;
Run Code Online (Sandbox Code Playgroud)

我基本上是在查询当前用户已收到或发送的消息。

sender_id&的参数值recipient_id是当前用户 ID。

我创建了以下索引:

CREATE INDEX ON message(recipient_id, sender_id);
Run Code Online (Sandbox Code Playgroud)

我想知道字段的顺序是否对我的用例很重要,请记住我的 SQL 查询中的 OR 子句。

有人可以帮忙吗?

postgresql performance index postgresql-performance

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