Questions tagged «postgresql»

PostgreSQL的所有版本。如果该上下文很重要,请添加其他特定于版本的标记,例如postgresql-11。

1
为什么Set Returning Function(SRF)在FROM子句中运行较慢?
这是数据库内部的问题。我使用的是PostgreSQL 9.5,我想知道为什么在FROM子句中设置返回函数(SRF)(也称为表值函数(TVF))运行速度较慢,例如当我执行这些命令时, CREATE TABLE foo AS SELECT * FROM generate_series(1,1e7); SELECT 10000000 Time: 5573.574 ms 它总是比 CREATE TABLE foo AS SELECT generate_series(1,1e7); SELECT 10000000 Time: 4622.567 ms 这里是否可以制定一条通用规则,以便我们应该始终在FROM子句之外运行Set-Returning Functions ?

1
PostgreSQL-使用成千上万的元素数组
我希望根据是否以整数数组形式传递的大量值列表中包含一列来选择行。 这是我当前使用的查询: SELECT item_id, other_stuff, ... FROM ( SELECT -- Partitioned row number as we only want N rows per id ROW_NUMBER() OVER (PARTITION BY item_id ORDER BY start_date) AS r, item_id, other_stuff, ... FROM mytable WHERE item_id = ANY ($1) -- Integer array AND end_date > $2 ORDER BY …

1
如何在Postgres中的CASE表达式上创建索引
我正在尝试在CASE表达式上创建索引,如下所示 CREATE TABLE test(i INT, j INT); CREATE UNIQUE INDEX test_index ON test(CASE WHEN i=1 THEN j END); 收到此错误: ERROR: syntax error at or near "CASE" LINE 1: CREATE UNIQUE INDEX test_index ON test(CASE WHEN i=1 THEN j ... ^ ********** Error ********** ERROR: syntax error at or near "CASE" …

1
了解SELECT列表中的集返回函数(SRF)
为什么在SELECT列表中使用Set Returning Function(SRF)与在FROM子句中使用SRF之间在行为上有区别? 例如,对于一个简单的SRF返回2行: CREATE OR REPLACE FUNCTION gen_series(out integer, out int) RETURNS SETOF record AS $$ SELECT 1,1 UNION SELECT 2,2; $$ LANGUAGE SQL; SELECT gen_series(); 返回两个单列行,每个行包含一条记录: => gen_series ------------ (1,1) (2,2) (2 rows) 而SELECT * FROM gen_series();返回记录扩展的两行: => column1 | column2 ---------+--------- 1 | 1 2 | 2 …

1
在PostgreSQL 8.3上备份并在PostgreSQL 9.4中还原后,数据库大小减小了
我pg_dump在托管在PostgreSQL 8.3服务器上的JIRA数据库上进行了操作。之后的数据库大小vacuum full为217132652(大约207 MB)。 然后,我使用以下命令在PostgreSQL 9.4服务器上还原了JIRA数据库: $ psql -X -v ON_ERROR_STOP=1 -d jira2 -U jira -h localhost < jiradb2017_03_12.sql 我假设自从使用以来,还原将在发生任何错误时退出ON_ERROR_STOP=1,但是SQL脚本正确完成了(尽管有些警告与数据还原无关)。 我最终得到了一个大小为158019348(大约151 MB)的数据库。 那么,这是什么故事呢?我是否可以仅假设数据库已成功恢复并且PostgreSQL优化了其存储引擎(介于8.3和9.4版本之间),并且正在更有效地利用空间?

1
PostgreSQL / PostGIS 9.6打破了我的复合索引
在PostgreSQL 9.2中,我创建一个具有地理(postGIS)类型和整数作为复合索引的索引没有问题。但是现在(9.6)它抱怨创建索引,我不明白它提供的提示: 列和数据均已正确创建,Postgres抱怨创建索引。 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. ********** Error********** ERROR: data type integer has no default operator class for access method …

2
pg_trigger_depth()是否可用于防止触发级联(递归)?
为什么pg_trigger_depth() = 0在防止触发级联(递归)时不好用(除调试外)? 有人可以提供代码来证明它为什么不好吗? 我正在猜测,因为如果多个触发器同时在同一数据上运行,则使用触发器停止的条件pg_trigger_depth() = 0将停止第二行执行的任何触发器。 我认为这将是解决这个问题的好方法,但有人告诉我: 在触发器内,是否有方法可以判断更新或插入是否来自触发器? 认为这将是一个很好的问题。 它在这里提供作为解决方案: 防止PostgreSQL中的递归触发器 Postgres 9.3文档: https://www.postgresql.org/docs/9.3/static/functions-info.html

1
从JSON对象创建UNIQUE约束
让我们举个例子表人,只有两个字段:id和data(json)。 SELECT data FROM peoples ; {"name": "Adam","pos":"DBA","age":22 } {"name": "Alice","pos":"Security","age":33 } {"name": "Bob","pos":"Manager","age":42 } 我想为“ pos”字段创建约束,该约束必须是唯一的。我在互联网上搜索了有关JSON约束的信息,但没有结果。 我该如何处理?

1
外部服务器的权限被拒绝
我试图建立一个具有有限权限的用户,该用户将能够创建外部表。我有两个数据库,hr_db和accounting_db。我已经hr_user为hr_db和创建了一个accounting_user用户accounting_db。我只希望accounting_user用户对某些hr_db表(例如表)具有选择权限users。为此,以超级用户身份进入hr_db数据库并运行: GRANT CONNECT ON DATABASE hr_db TO accounting_user; GRANT SELECT ON people TO accounting_user; 我设置了一个连接hr_db从accounting_db使用外国数据包装: CREATE SERVER hr_db FOREIGN DATA WRAPPER postgres_fdw OPTIONS (host 'localhost', dbname 'hr_db', port '5432'); 然后,我为accounting_user用户添加了一个映射: CREATE USER MAPPING FOR accounting_user SERVER hr_db OPTIONS (user 'accounting_user', password 'secretpassword'); 的密码accounting_user与我从命令行登录时使用的密码相同。这很好用: psql -U accounting_user -W hr_db [enter accounting_user …

3
有人可以解释执行数百万次更新的怪异行为吗?
有人可以向我解释这种行为吗?我在OS X本机上运行的Postgres 9.3上运行了以下查询。我试图模拟一些行为,其中索引大小可能变得比表大小大得多,而发现了一些更奇怪的事情。 CREATE TABLE test(id int); CREATE INDEX test_idx ON test(id); CREATE FUNCTION test_index(batch_size integer, total_batches integer) RETURNS void AS $$ DECLARE current_id integer := 1; BEGIN FOR i IN 1..total_batches LOOP INSERT INTO test VALUES (current_id); FOR j IN 1..batch_size LOOP UPDATE test SET id = current_id + …

4
并发团体预订的策略?
考虑一个座位预订数据库。有一个n个席位的列表,每个席位都有一个属性is_booked。0表示不是,1表示是。任何更高的数量,都有一个超额预订。 在不允许超额预定的情况下进行多笔交易(每笔交易将同时预订一组y个席位)的策略是什么? 我只需选择所有未预订的座位,从中随机选择一组y,然后全部预订,然后检查预订是否正确(也就是is_booked的数量未超过一个,这表示已预订了该座位的另一笔交易,提交),然后提交。否则中止并重试。 这在Postgres中的隔离级别Read Committed上运行。

7
如何在定界符之后生成所有尾随子字符串?
给定一个可能包含定界符的多个实例的字符串,我想生成该字符之后的所有子字符串。 例如,给定一个类似'a.b.c.d.e'(或array {a,b,c,d,e})的字符串,我想生成一个类似以下的数组: {a.b.c.d.e, b.c.d.e, c.d.e, d.e, e} 预期的用法是触发填充一列,以便每当写入另一列时都q.x.t.com可以更轻松地查询域名部分(即查找所有要查询的内容t.com)。 解决这个问题似乎很尴尬(也许很好),但是现在我很好奇如何用(Postgres')SQL编写这样的函数。 这些是电子邮件域名,因此很难说出元素的最大数量是多少,但是可以肯定的是绝大多数元素都小于5。

1
CLUSTER对性能的影响
我正在尝试优化我的Postgres 9.2数据库以加快具有日期限制的查询。 我有一timestamp列,但大多数情况下我都想找一天,所以我创建了一个timestamp要date解析的索引: CREATE INDEX foo_my_timestamp_idx ON foo USING btree ((my_timestamp::date) DESC); 现在,为了提高性能,我CLUSTER foo使用上面的索引表: CLUSTER foo USING foo_my_timestamp_idx; 根据SQL-CLUSTER上的手册,该表 根据索引信息进行物理重新排序 我想知道使用表PK(请说id_foo)对其他查询的性能是否有影响。有没有缺点?

1
谁是“骗子”,为什么他拥有我的架构?
我在Compose.io中具有Postgres DB部署,并且我正在为我的应用程序使用标准的“ compose”数据库。我想清除当前数据库的内容,以便可以使用新的架构重新创建数据库。我已经读到,做到这一点的最佳方法是使用“删除架构公共级联”,但是当我尝试在数据库上执行此操作时,我得到了 ERROR: must be owner of schema public 事实证明,该模式不是由admin(组成用户提供psql访问)所拥有,而是由一个名为的用户所拥有focker。 compose=> \dn List of schemas Name | Owner --------+-------- public | focker (1 row) 我尝试更改架构所有者,但失败,并出现与上述相同的错误。 为什么我的数据库是这样设置的?有什么办法可以更改它,以便管理员用户可以清除数据库?

2
要分区还是不分区?
已经阅读了关于SO,外部博客文章和手册的几个问题 SO:Pg中分区表的外键约束 dba.SE:在Pg中处理FK到分区表的不同方法 手册:继承 手册:分区 手册:约束触发器 博客:具有继承性的Postgres建模 我仍然发现自己想知道是否应该考虑我的情况进行分区。 案例-简化 存储客户数据。为了清楚起见,下面提到的所有表名均已组成。 具有需要客户识别的非物理对象,以及需要将某些对象按需发送回客户或以其他方式进行处理的情况下,实际存储它们的物理对象。它们以多对多关系映射。objects_nonphysical,objects_physical,objects_mapping_table。 第二个多对多关系是这些非物理对象与其度量之间的关系。有些对象与某些指标绑定。metrics,metrics_objects_nonphysical 非物理对象和物理对象都有其子级关系表。objects_nonphysical_hierarchy,objects_physical_hierarchy 根据每个客户的需求和要求,可以提供有关物理对象的数据,或者可能需要从头开始创建。基本上,我需要做的是: 保持内部系统的快速运行INSERT和SELECT声明,因为这是要进行映射的地方。 维护系统以供外部客户查看和操作其非物理对象 -快速检索数据。报表高效性的需求SELECT -许多客户可以随时使用此数据进行搜索。 我的考虑 可以有一个客户,他们可以访问数据,查看数据并对其进行操作,但是不必是我们从中获取数据/正在处理数据的承包商。 考虑到我总是知道应该将哪些分区数据归入(针对承包商的分区),然后考虑到需要为客户进行分区的外部客户的维护系统,这导致我将表分区引入到我的系统中(某些情况下可以做到这一点)延迟使用自动化工具和一组规则以客户的方式重写数据,因此对于每个客户,我们只为每个表扫描一个分区。 数据量 我的数据将不断增长,尤其是在导入新客户的对象和指标时。从长远来看,目前无法预测新数据进入系统的速度。确实,没有知道谁将成为下一个客户,就无法衡量它。眼下正好有2客户提供更多或更少的1M行对每个表的每个客户。但是将来我预计新客户也将有1000万行左右。 问题 这些问题都是相互关联的。 应该在这里真正考虑分区,还是过大?我认为它很有用,因为我始终只扫描一个分区。 如果要进行分区,那么如何FK考虑到我的需求最有效地实施约束?我应该选择constraint triggers还是将其保留在内部系统的应用程序层中,或者使用其他方法? 如果无法进行分区,那我应该深入研究什么呢? 如果没有足够的数据,请在下面的评论中让我知道。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.