标签: postgresql

将串行列添加到大表的最有效方法

将 BIGSERIAL 列添加到大表(约 3 Bil. 行,约 174Gb)的最快方法是什么?

编辑:

  • 我希望该列是现有行 ( NOT NULL) 的递增值。
  • 我没有设置填充因子(回想起来,这似乎是一个错误的决定)。
  • 我对磁盘空间没有问题,只是希望它尽可能快。

postgresql performance sequence update

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

在针对另一台机器的 pg_dump 期间创建“pg_catalog.tablename”的权限被拒绝

我正在尝试将一些表从 9.5 beta 2 转储到 9.4.4 服务器。我使用的命令的形式是相当标准的:

pg_dump -t table dbname | psql -h hostname -d dbname
Run Code Online (Sandbox Code Playgroud)

我正在使用 Postgres 用户,我意识到这可能并不理想,但因为它们都是我只使用的开发数据处理框,并且与随后的错误相关。最初,我得到了错误

错误:无法识别的配置参数“row_security”

这是预期的,因为此功能是 9.5 中的新功能,是的,我意识到不建议在不同的 Postgres 版本之间使用 pg_dump,但是,遗憾的是,这是不可避免的,因为我遇到了一个非常模糊的错误,并且需要移动一个大的一次静态数据量。

因此,使用这个可怕的 hack 来删除 row_security 错误,并在第一个错误时打开停止:

pg_dump -t tablemame dbname |sed 's/SET row_security = off;//'|
psql -v ON_ERROR_STOP=1 -h hostname -d dbname
Run Code Online (Sandbox Code Playgroud)

我现在得到:

错误:权限被拒绝创建“pg_catalog.tablename”详细信息:当前不允许修改系统目录

虽然使用 Postgres 用户/角色可能是不可取的,但我的理解是不应该有这种性质的许可问题。我对任何建议持开放态度,因为这是一次性操作,并且这些是未连接到任何实时服务的数据处理开发箱,因此权宜之计优于理想的公司数据访问策略。话虽如此,最好了解如何正确执行此操作并在将来避免这种情况。

postgresql postgresql-9.4 postgresql-9.5

12
推荐指数
1
解决办法
6761
查看次数

将 Postgres TIMESTAMP 转换为 TIMESTAMPTZ

我有一个在 Postgres 上运行的大小合适(约 50k 行)的时间序列数据库,还有一些其他结构化数据(在另一个数据库实例中)要小得多。

愚蠢的是,当我最初设计这个东西时,我把所有的字段都作为TIMESTAMP WITHOUT TIME ZONE,现在我用恼人的时区相关的错误来支付它。我希望一切都是明确的,所以想将字段转换为TIMESTAMP WITH TIME ZONE. 我意识到这不会存储额外的信息,并且我所有的时间戳都已经在 UTC 中,所以迁移应该是微不足道的,但我想知道是否有任何复杂的事情/潜在的绊倒块会证明有问题(这是一个生产客户依赖它的数据库)?

postgresql migration datatypes timezone

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

PostgreSQL 中的 BLOB 或引用

我需要将二进制数据文件存储在运行在 Ubuntu 服务器上的 PostgreSQL 数据库中。最初将有几十个文件,每个文件大小约为 250kb。但是,文件的数量会随着时间的推移而增加。我有时可能需要从文件中提取数据以进行其他下游分析。

我已经对将二进制数据存储为 BLOB 或引用的古老问题进行了一些研究。两者显然各有利弊。是否有任何与 PostgreSQL 相关的特定问题需要我注意?如果我想通过 PostgreSQL 函数或通过外部 Python 程序从文件中提取数据,是一种方法还是另一种方法更可取?

如果我将数据文件直接存储在数据库中,将它们存储在一个带有引用“主”表的外键的单独表中,而不是包含所有其他字段的表中会更好吗?

我已经阅读了这里的问题和答案;那里的评论表明在 Linux 上通过引用(在文件系统中)存储二进制文件更好。我在这里的问题特别与 PostgreSQL 有关,以及从文件中提取数据以进行各种分析。

更新:类似的问题

postgresql

11
推荐指数
1
解决办法
2102
查看次数

带有 LIMIT 的慢 ORDER BY

我有这个查询:

SELECT * 
FROM location 
WHERE to_tsvector('simple',unaccent2("city"))
   @@ to_tsquery('simple',unaccent2('wroclaw')) 
order by displaycount
Run Code Online (Sandbox Code Playgroud)

我很高兴:

"Sort  (cost=3842.56..3847.12 rows=1826 width=123) (actual time=1.915..2.084 rows=1307 loops=1)"
"  Sort Key: displaycount"
"  Sort Method: quicksort  Memory: 206kB"
"  ->  Bitmap Heap Scan on location  (cost=34.40..3743.64 rows=1826 width=123) (actual time=0.788..1.208 rows=1307 loops=1)"
"        Recheck Cond: (to_tsvector('simple'::regconfig, unaccent2((city)::text)) @@ '''wroclaw'''::tsquery)"
"        ->  Bitmap Index Scan on location_lower_idx  (cost=0.00..33.95 rows=1826 width=0) (actual time=0.760..0.760 rows=1307 loops=1)"
"              Index Cond: (to_tsvector('simple'::regconfig, unaccent2((city)::text)) @@ '''wroclaw'''::tsquery)"
"Total runtime: 2.412 ms"
Run Code Online (Sandbox Code Playgroud)

但是当我添加 LIMIT 时,执行时间超过 …

postgresql performance index full-text-search

11
推荐指数
1
解决办法
4518
查看次数

PostgreSQL 数据类型 text vs varchar 没有长度

在 PostgreSQL 中,您可以创建一个数据类型为字符可变(没有长度精度)或文本的列,如下所示:

ALTER TABLE test ADD COLUMN c1 varchar;
ALTER TABLE test ADD COLUMN c2 text;
Run Code Online (Sandbox Code Playgroud)

这两种数据类型有区别吗?

文档对此并不清楚。他们说 :

如果在没有长度说明符的情况下使用字符变化,则该类型接受任何大小的字符串。

[...]

另外,PostgreSQL 提供了text类型,可以存储任意长度的字符串。

似乎这两种数据类型是等效的,但它并不明确......有关此的更多信息?

谢谢你,尼科

postgresql datatypes

11
推荐指数
1
解决办法
6152
查看次数

对值为 NULL 的布尔值进行查询时出现意外的 Seq 扫描

我有一个名为auto_reviewwhere column type is的数据库列boolean。该字段有一个索引,使用 ActiveRecord ORM 创建。

CREATE INDEX index_table_on_auto_renew ON table USING btree (auto_renew);
Run Code Online (Sandbox Code Playgroud)

当我查询布尔值的字段时,PG 按预期使用索引。

EXPLAIN for: SELECT "table".* FROM "table"  WHERE "table"."auto_renew" = 'f'
                                          QUERY PLAN
----------------------------------------------------------------------------------------------
 Bitmap Heap Scan on table  (cost=51.65..826.50 rows=28039 width=186)
   Filter: (NOT auto_renew)
   ->  Bitmap Index Scan on index_domains_on_auto_renew  (cost=0.00..44.64 rows=2185 width=0)
         Index Cond: (auto_renew = false)
(4 rows)
Run Code Online (Sandbox Code Playgroud)

当值为 时NULL,使用顺序扫描。

EXPLAIN for: SELECT "table".* FROM "table"  WHERE "table"."auto_renew" IS NULL
                           QUERY PLAN
----------------------------------------------------------------
 Seq Scan …
Run Code Online (Sandbox Code Playgroud)

postgresql index postgresql-8.3 postgresql-9.1

11
推荐指数
1
解决办法
3871
查看次数

收听/通知权限

我有一个 postgres 数据库,有两个用户;爱丽丝和鲍勃。

我希望能够做到这一点,NOTIFY alice_channel 'sensitive data'而鲍勃无法LISTEN通过猜测频道名称是“alice_channel”而偷偷摸摸地进入。

在实践中,频道名称很难猜测,但是这是安全通过朦胧的最好的。

我认为没有办法阻止数据库用户使用(滥用)LISTEN&NOTIFY是否正确?似乎没有任何可以授予或撤销的相关权限。

这是一个死胡同吗?

postgresql postgresql-9.2

11
推荐指数
1
解决办法
1100
查看次数

寻找最长前缀的算法

我有两张桌子。

第一个是带前缀的表

code name price
343  ek1   10
3435 nt     4
3432 ek2    2
Run Code Online (Sandbox Code Playgroud)

二是带有电话号码的通话记录

number        time
834353212     10
834321242     20
834312345     30
Run Code Online (Sandbox Code Playgroud)

我需要编写一个脚本,从每条记录的前缀中找到最长的前缀,并将所有这些数据写入第三个表,如下所示:

 number        code   ....
 834353212     3435
 834321242     3432
 834312345     343
Run Code Online (Sandbox Code Playgroud)

对于数字 834353212,我们必须修剪 '8',然后从前缀表中找到最长的代码,即 3435。
我们必须始终先删除 '8',并且前缀必须在开头。

我很久以前以非常糟糕的方式解决了这个任务。它是糟糕的 perl 脚本,它对每条记录进行大量查询。这个脚本:

  1. 从调用表中取一个数字,在循环中从 length(number) 到 1 => $prefix 做子串

  2. 执行查询: select count(*) from prefixes where code like '$prefix'

  3. 如果计数> 0,则取第一个前缀并写入表

第一个问题是查询计数 - 它是call_records * length(number). 第二个问题是LIKE表达。恐怕那些很慢。

我试图通过以下方式解决第二个问题:

CREATE EXTENSION pg_trgm;
CREATE INDEX prefix_idx ON prefix USING …
Run Code Online (Sandbox Code Playgroud)

postgresql performance pattern-matching postgresql-9.1 query-performance

11
推荐指数
1
解决办法
8904
查看次数

在 IPv6 地址上拒绝 Postgres 连接访问

在 Windows 上安装了 PostgreSQL 9.1 x64,设置了一个监听地址,但是在与 pgAdmin 连接时出现以下错误。不知道为什么 PostgreSQL 看到的是我的 IPv6 地址而不是我的常规 IP 地址:

在此处输入图片说明

为了让身份验证工作,根据错误消息,我更新pg_hba.conf了这个:

host all all fe80::c5d2:XXXX:XXXX:3bc0/12 trust

那行得通,但它很丑陋,而且太具体了。我根据 PostgreSQL 文档尝试了以下操作,但没有成功,我收到相同的“访问被拒绝”错误:

local all all trust
host all all 0.0.0.0/12 trust
Run Code Online (Sandbox Code Playgroud)

我让这个工作了,它涵盖了整个 IPv6 地址空间,但是如何指定 IPv6 范围以获得更多限制?

host  mydb  myuser  ::/0   trust
Run Code Online (Sandbox Code Playgroud)

问题

  • 为什么 pgAdmin 选择我的 IPv6 地址而不是我的普通 IP?
  • 如何在不诉诸于 IPv6 的情况下指定范围::/0

postgresql authentication postgresql-9.1

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