小编Erw*_*ter的帖子

不使用数字字段的索引

我在 Debian x86 上安装了 PG 服务器(9.0.4)。
在我的一张桌子中,我使用numeric(6,1)

CREATE TABLE mytable(name text, numfield numeric(6,1))
Run Code Online (Sandbox Code Playgroud)

还为此字段创建了索引:

CREATE INDEX mytable_numfield_idx ON mytable USING btree (numfield);
Run Code Online (Sandbox Code Playgroud)

如果我将此字段与实数值一起使用,一切都会很好。正如我看到的查询使用索引:

EXPLAIN ANALYZE SELECT * FROM kodiall WHERE kodgo=123.0
Run Code Online (Sandbox Code Playgroud)

在 mytable 上使用 mytable_numfield_idx 进行索引扫描(cost=0.00..8.27 rows=1 width=193)(实际时间=0.085..0.087 rows=1 loops=1)

索引条件:(numfield = 123.0)

总运行时间:0.131 毫秒

但是如果我使用 0.0 或 NULL 作为条件值,由于某种原因索引被忽略:

EXPLAIN ANALYZE SELECT * FROM kodiall WHERE numfield=0.0
--EXPLAIN ANALYZE SELECT * FROM kodiall WHERE numfield=NULL
Run Code Online (Sandbox Code Playgroud)

mytable 上的 Seq Scan (cost=0.00..57.80 rows=1080 width=193) (实际时间=0.033..1.853 rows=1088 loops=1)

过滤器:(numfield = …

postgresql index

6
推荐指数
1
解决办法
1947
查看次数

按索引删除数组元素

是否可以通过索引删除 Postgres 数组元素?(使用 Postgres 9.3。)

我在文档(http://www.postgresql.org/docs/9.3/static/functions-array.html)中没有看到任何相关内容,但也许我还缺少其他功能?

postgresql array

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

检查是否存在连续的日期间隔

我在 PostgreSQL 中有一个表,它描述了一些具有开始日期和结束日期的事件:

CREATE TABLE my_table
(
  event_id serial NOT NULL,
  start_date timestamp without time zone NOT NULL,
  end_date timestamp without time zone NOT NULL
)
Run Code Online (Sandbox Code Playgroud)

单个事件可能与前一个和下一个事件重叠。在下表中,4 个事件中的前 3 个形成连续的时间间隔:

1   '2015-04-02 22:09:03'   '2015-04-02 22:19:05'
2   '2015-04-02 22:17:38'   '2015-04-02 22:27:38'
3   '2015-04-02 22:25:21'   '2015-04-02 22:36:23'
4   '2015-04-02 22:45:23'   '2015-04-02 22:55:23'
Run Code Online (Sandbox Code Playgroud)

是否可以编写一个查询来检查两个给定日期之间是否存在连续的日期间隔?

我想要一些类似的东西:

select ...
from my_table
where start_date > '2015-04-02' and end_date < '2015-04-06'
Run Code Online (Sandbox Code Playgroud)

postgresql window-functions gaps-and-islands

6
推荐指数
1
解决办法
7138
查看次数

PostgreSQL 强制所有数据大写

有没有办法强制所有文本数据为大写,而不必重复为每个表编写函数或在客户端执行?

postgresql postgresql-9.4 case-sensitive

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

向 Postgres 数据库添加新的排序规则

我有这些整理:

postgres=# select * from pg_collat​​ion;
  姓名 | collnamespace | 领主| collencoding | 整理 | 类型  
------------+--------------+-----------+--------- -----+-------------+------------
 默认 | 11 | 10 | -1 | |
 C | 11 | 10 | -1 | C | C
 POSIX | 11 | 10 | -1 | POSIX | POSIX
 zh_CN | 11 | 10 | 6 | en_US.utf8 | en_US.utf8
 en_US.utf8 | 11 | 10 | 6 | en_US.utf8 | en_US.utf8
 ucs_basic | 11 | 10 | 6 | C …

postgresql collation localization

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

Postgres 9.4+:JSONB 而不是 EAV

我正在想办法构建一个新的 PostgreSQL 数据库,我很好奇是否可以使用 JSONB 列而不是 EAV 模型来存储实体的属性。这似乎是一种灵活的方式来存储这些东西。

在 EAV 情况下,我将有 3 个表:

materials (mat_id, mat_name, mat_descr)
material_properties (prop_id, prop_name, prop_desc)
material_property_values (mat_id, prop_id, val)
Run Code Online (Sandbox Code Playgroud)

每种材料都可以有一组不同的属性。

有什么原因我不应该只mat_props JSONB在我的materials表中添加一列,并将所有属性存储在那里{"name":"value"}?这样,将属性作为列进行查询将非常简单:

SELECT mat_name, mat_props->'name' as propval FROM materials
Run Code Online (Sandbox Code Playgroud)

而不是连接或子选择。

另外,我是否可以在materials表中添加此列,或者将其保存在单独的表中是否会更高效:

material_properties (mat_id, properties JSONB)
Run Code Online (Sandbox Code Playgroud)

postgresql database-design eav json

6
推荐指数
1
解决办法
2161
查看次数

截断父表但不截断子表

我在 PostgreSQL 9.4 中有一个表,我对其进行了分区,以便对父分区的所有插入实际上都进入其中一个子分区。问题是在创建分区之前,我的父表中已经有数亿行数据。

父级和子级存在于不同的模式中:

家长:public.history_uint
孩子:partitions.history_uint_p2015_mm_dd

这是我创建分区的方式。

TRUNCATE父母如何而不是孩子?

postgresql partitioning truncate postgresql-9.4

6
推荐指数
1
解决办法
1985
查看次数

PostgreSQL 和表继承

我不确定这是否适合这个地方,所以请随时告诉我它是否偏离主题或有更好的发帖地方。

我正在做一个基于幻想体育的项目,桌子的数量越来越多。我有诸如nba_players,nfl_players等和nba_players_to_teams,nfl_players_to_teams等表(NBA 和 NFL 分别是篮球和美式橄榄球联盟)。这些都共享相同的表模式和代码库,但在不同的表上有它们的外键。

我的问题是,在这种情况下使用表继承有意义吗?“基”表将是空的,仅用于强制执行模式。对“基”表的更改会传播到从它继承的表吗?在这一点上,模式非常稳定,所以这不是一个大问题。

有没有我没有解决的想法或疑虑?我仍在阅读有关表继承及其优缺点的文章,但您拥有的任何资源都将不胜感激。

postgresql database-design inheritance

6
推荐指数
1
解决办法
593
查看次数

使用 intarray 对数组元素进行分组和计数

我正在处理启用了intarray扩展的 Postgres 9.4项目。我们有一个看起来像这样的表:

items
-------------------------------------
id    name                  tag_ids  
--------------------------------------
1     a car                 {1,4}
2     a room to rent        {1}
3     a boat                {1,2,4,11}
4     a wine                {2}
5     emily                 {3}
Run Code Online (Sandbox Code Playgroud)

如果可能,我想对标签 ID 进行分组。就像获取具有tag_id“{1,2,4,11}”的所有元素的计数

tag_id  count
1       3
2       2
4       2
11      1
Run Code Online (Sandbox Code Playgroud)

这可能吗?我会认为这样的交叉点:

select * from items where tag_ids && '{1,2,4,11}'
Run Code Online (Sandbox Code Playgroud)

但我需要按交集结果的数组元素进行分组。如果我按 tag_ids 分组,它只是唯一值。

我该怎么做?

postgresql aggregate array

6
推荐指数
1
解决办法
2794
查看次数

如何将一列的多个值计为一组?

我有一个main包含以下行的表:

 id |  name  | rank
----+--------+------
  1 | Ali    | a
  2 | Sami   | b
  3 | Khan   | c
  4 | Kamran | d
  5 | Imran  | e
  6 | Asad   | a
  7 | Nawid  | v
  8 | Jamil  | c
  9 | Usman  | j
Run Code Online (Sandbox Code Playgroud)

我想计算 column 中具有某些值的行rank。例如,我想按如下方式对值进行分组:

  • (a,b,v)应按名称归入一组myvalues
  • (c,d,j)应该按名称出现在另一个组中yourvalues
  • (e)应该通过 name 到达另一个组extravalues

我想要的结果:

myvalues | yourvalues …
Run Code Online (Sandbox Code Playgroud)

postgresql aggregate postgresql-9.1 aggregate-filter

6
推荐指数
1
解决办法
8136
查看次数