标签: postgresql

有没有办法可以加快针对此特定视图的查询?

我在 PostgreSQL 数据库中有三个表,我通过视图和一些连接进行查询。

CREATE TABLE network_info (
  network         CIDR          NOT NULL,
  some_info       TEXT          NULL,
  PRIMARY KEY (network)
);

CREATE TABLE ipaddr_info (
  ipaddr          INET          NOT NULL,
  some_info       INT           NULL,
  PRIMARY KEY (ipaddr, some_info)
);

CREATE TABLE ipaddrs (
  addr            INET          NOT NULL,
  PRIMARY KEY (addr)
);

CREATE VIEW ipaddr_summary AS
SELECT DISTINCT
  i.addr                  AS ip_address,
  a.some_info             AS network_info,
  COUNT(b.ipaddr)         AS ip_info_count
FROM ipaddrs AS i
LEFT JOIN network_info AS a
  ON (i.addr << a.network)
LEFT JOIN ipaddr_info AS b
  ON …
Run Code Online (Sandbox Code Playgroud)

postgresql performance join database-design index-tuning postgresql-performance

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

PostgreSQL SELECT 主键为“串行”或“大串行”

我已经啮合在一起的方式来确定什么data_type是在data_type创建基于掀起了新表时,你的语法使用PostgreSQL的维基页面。

如果我的查询有问题,我需要真正知道在给定场景中什么会在显式上下文中抛出它在纯粹的测试数据库/表上运行一个或多个查询以修改该数据库/表,所以运行这个查询以测试任何误报。

SELECT pg_attribute.attname, 
format_type(pg_attribute.atttypid, pg_attribute.atttypmod),
CASE 
WHEN format_type(pg_attribute.atttypid, pg_attribute.atttypmod)='bigint' THEN 'bigserial'
WHEN format_type(pg_attribute.atttypid, pg_attribute.atttypmod)='integer' THEN 'serial'
END AS type
FROM pg_index, pg_class, pg_attribute 
WHERE pg_class.oid = 'delete2'::regclass 
AND indrelid = pg_class.oid 
AND pg_attribute.attrelid = pg_class.oid 
AND pg_attribute.attnum = any(pg_index.indkey) 
AND indisprimary;
Run Code Online (Sandbox Code Playgroud)

这是一个带有主键的表,该表不使用此查询返回主键:

CREATE TABLE delete_key_bigserial (
  test1 integer,
  id bigserial NOT NULL,
  col1 text,
  col2 text,
  test2 integer
);
Run Code Online (Sandbox Code Playgroud)

postgresql primary-key datatypes sequence catalogs

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

通过连接插入多个值

我有三个表,代表两个实体和一个连接关系。每个实体关系都有一个人工代理键​​,用于代替自然键的外键约束。

CREATE TABLE Person (
person_id SERIAL PRIMARY KEY,
username VARCHAR NOT NULL UNIQUE
);

CREATE TABLE Group (
group_id SERIAL PRIMARY KEY,
group_name VARCHAR NOT NULL UNIQUE
);

CREATE TABLE GroupMember (
person_id INTEGER REFERENCES Person,
group_id INTEGER REFERENCES Group,
PRIMARY KEY (person_id, group_id)
);
Run Code Online (Sandbox Code Playgroud)

我想在关系中插入多个条目GroupMember,但使用关联实体的自然键。类似的东西:

INSERT INTO GroupMember (person_id,group_id)
SELECT person_id,group_id
FROM Person P, Group G, (
('alice','girls'),
('bob','boys'),
('alice','coolkids'),
('bob','coolkids')
) AS X
WHERE P.username = X.1 AND G.group_name = X.2;
Run Code Online (Sandbox Code Playgroud)

显然,上述语法无效,但希望能传达这个想法。有没有办法在 PostgreSQL 中做到这一点?

postgresql join insert

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

如果行更改,如何回滚事务?

我正在使用Postgres 9.3.

当我更新表中的行时,我的流程如下所示:

  1. 获取旧行(例如SELECT * FROM tbl WHERE id = 1
  2. 在旧数据范围内验证新数据(在第 1 点中提取的旧行) - 这是由我的应用程序在 postgres 之外完成的。
  3. 用新数据更新行(例如UPDATE tbl SET .... WHERE id = 1

问题是old数据可能在第 2 点期间发生变化,因此验证,即使通过也可能是outdated在第 3 点(更新行)期间。我知道我可以执行这样的更新UPDATE .... WHERE id = 1 AND column1='oldValue'以确保某些字段不会更改,但是我的验证(也比较新旧值)非常复杂,我无法在 SQL UPDATE 语句中“编写”它。

所以我想到了这样的事情:

  1. BEGIN
  2. SELECT * FROM tbl WHERE id = 1
  3. 在我这边执行验证
  4. UPDATE SET=... WHERE id = 1
  5. COMMIT

COMMIT如果在事务执行期间 id = 1 的行发生更改,我想失败。是否可以使用这样的交易?如果不是,其他解决方案是什么?

postgresql postgresql-9.3

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

与同一个表的额外自然连接如何两次*减少*行数

这是来自我的数据库的真实结果。我花了一些时间尝试使用 SSCCE 重现此行为,但失败了。下面的最后一个结果怎么可能?

SELECT COUNT(*) FROM rr.resource    a
--- 15771

SELECT COUNT(*) FROM rr.resource    a
NATURAL JOIN rr.interface   b
--- 41419

SELECT COUNT(*) 
FROM rr.resource    a
NATURAL JOIN rr.interface   b
NATURAL JOIN rr.interface   c
--- 0
Run Code Online (Sandbox Code Playgroud)

上次查询中的零 (0) 行计数每次都是一致且可重复的。在我创建的一些示例中,向同一个表添加第二个自然连接两次会产生相同数量的行(正如我所期望的)。那么上面的结果怎么可能呢?

postgresql

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

如何按依赖顺序删除和创建 postgresql 视图?

我发现以下/sf/answers/679843601/这很好,但对我来说仍然太多体力劳动。我需要以正确的顺序重新创建视图我将如何去做?

@dbenhur 谈到以下内容:

为了更完整,人们可以弄清楚如何查询哪些视图取决于您正在修改的表,并使用该查询而不是枚举视图名称。需要了解 pg_rewrite | pg_rule 来做到这一点,我认为

我不确定这到底是什么意思,但我会告诉你我需要,你告诉我是否可能。

我在一个 rails 应用程序中工作,我试图在其中维护视图和函数作为 rails 迁移的一部分,不幸的是这变得一团糟,我将我们的视图和函数转储到单独的文件中。在我看来,有两种前进的方式。我可以为这些使用单个文件,这使得它很麻烦,但我想 DDL 的顺序将由 pg_dump 管理。

或者,当我转储视图和函数时,我也可以查询并创建一个依赖树,稍后我会用它来重新创建它们。原因是手动更改视图中的列名变得太复杂了。

其他人如何维护他们的 DDL?有人做过我想做的事吗?

postgresql postgresql-9.4

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

有:Postgres 数据库文件。需要:功能数据库

我正在运行带有 postgres/postgis 设置的 Ubuntu 14.04,并在一个微弱的时刻删除了 PostgreSQL 9.1(在我升级到 14.04 之前似乎是从 12.04 安装的遗留安装),错误地说服自己我当前的 postgis 设置仅依赖于 9.3。

事实并非如此,更糟糕的是,我在实例运行时将其删除,因此我前往存储库恢复 9.1。

Ubuntu 的存储库没有 14.04 的 PostgreSQL 9.1,所以我从源代码编译,这样我就可以运行 pg_dump 或 pg_upgrade,这需要两者的二进制文件。

但是我当时的问题是,仅仅因为我现在又有了 9.1 的工作版本,这并没有使我的数据库从早期可见。

因此,据我所知,我的数据库文件完好无损,但我需要将它们与我今天安装的新 9.1 服务“挂钩”。我希望它是微不足道的,但它让我难住了几个小时。关于从哪里开始更新配置的任何指示?

postgresql migration postgresql-9.1 postgresql-9.3

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

如何处理用于 Postgres Slave 重置的 WAL 文件

所以昨晚我们的 PG Slave 在大量重新配置磁盘空间、新驱动器等后空间不足,现在报告以下错误:

FATAL:  could not receive data from WAL stream: FATAL:  requested WAL segment 00000001000018F70000008A has already been removed
Run Code Online (Sandbox Code Playgroud)

根据我所做的阅读,似乎唯一的解决方案是使用 pg_start_backup() 等重新同步从站。基于此,我有几个问题。

  1. 有没有更好的方法来修复我只是错过或忽略的奴隶?
  2. 在备份之前或备份期间,我是否需要清除从属和/或主服务器上的 WAL 文件?
  3. 这段时间pg_start_backup 是否锁定了数据库?

根据要求,可以找到日志文件:http : //pastebin.com/9F8vJh6R,已删除文件的其余部分,因为它只有 5 个小时的相同重复错误

非常感谢

postgresql postgresql-9.1

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

MySQL是否支持查询当前运行的事务id

PostgreSQL 支持使用如下查询检索当前正在运行的事务 ID:

select txid_current();
Run Code Online (Sandbox Code Playgroud)

MySQL 有没有这样的等价物?

mysql postgresql transaction

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

将 Postgres 查询结果放入数组

如何使用 Postgres 将 sql 查询结果放入字符串数组中?我在表 'mytable' 的 'zone' 列中有一些属性,我必须把它们全部放在 aString[] areas; 这是我的第一个请求,如果我犯了一些格式错误,抱歉。

postgresql aggregate c# array

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