将 BIGSERIAL 列添加到大表(约 3 Bil. 行,约 174Gb)的最快方法是什么?
编辑:
NOT NULL) 的递增值。我正在尝试将一些表从 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 用户/角色可能是不可取的,但我的理解是不应该有这种性质的许可问题。我对任何建议持开放态度,因为这是一次性操作,并且这些是未连接到任何实时服务的数据处理开发箱,因此权宜之计优于理想的公司数据访问策略。话虽如此,最好了解如何正确执行此操作并在将来避免这种情况。
我有一个在 Postgres 上运行的大小合适(约 50k 行)的时间序列数据库,还有一些其他结构化数据(在另一个数据库实例中)要小得多。
愚蠢的是,当我最初设计这个东西时,我把所有的字段都作为TIMESTAMP WITHOUT TIME ZONE,现在我用恼人的时区相关的错误来支付它。我希望一切都是明确的,所以想将字段转换为TIMESTAMP WITH TIME ZONE. 我意识到这不会存储额外的信息,并且我所有的时间戳都已经在 UTC 中,所以迁移应该是微不足道的,但我想知道是否有任何复杂的事情/潜在的绊倒块会证明有问题(这是一个生产客户依赖它的数据库)?
我需要将二进制数据文件存储在运行在 Ubuntu 服务器上的 PostgreSQL 数据库中。最初将有几十个文件,每个文件大小约为 250kb。但是,文件的数量会随着时间的推移而增加。我有时可能需要从文件中提取数据以进行其他下游分析。
我已经对将二进制数据存储为 BLOB 或引用的古老问题进行了一些研究。两者显然各有利弊。是否有任何与 PostgreSQL 相关的特定问题需要我注意?如果我想通过 PostgreSQL 函数或通过外部 Python 程序从文件中提取数据,是一种方法还是另一种方法更可取?
如果我将数据文件直接存储在数据库中,将它们存储在一个带有引用“主”表的外键的单独表中,而不是包含所有其他字段的表中会更好吗?
我已经阅读了这里的问题和答案;那里的评论表明在 Linux 上通过引用(在文件系统中)存储二进制文件更好。我在这里的问题特别与 PostgreSQL 有关,以及从文件中提取数据以进行各种分析。
更新:类似的问题。
我有这个查询:
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 中,您可以创建一个数据类型为字符可变(没有长度精度)或文本的列,如下所示:
ALTER TABLE test ADD COLUMN c1 varchar;
ALTER TABLE test ADD COLUMN c2 text;
Run Code Online (Sandbox Code Playgroud)
这两种数据类型有区别吗?
文档对此并不清楚。他们说 :
如果在没有长度说明符的情况下使用字符变化,则该类型接受任何大小的字符串。
[...]
另外,PostgreSQL 提供了text类型,可以存储任意长度的字符串。
似乎这两种数据类型是等效的,但它并不明确......有关此的更多信息?
谢谢你,尼科
我有一个名为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) 我有一个 postgres 数据库,有两个用户;爱丽丝和鲍勃。
我希望能够做到这一点,NOTIFY alice_channel 'sensitive data'而鲍勃无法LISTEN通过猜测频道名称是“alice_channel”而偷偷摸摸地进入。
在实践中,频道名称是很难猜测,但是这是安全通过朦胧的最好的。
我认为没有办法阻止数据库用户使用(滥用)LISTEN&NOTIFY是否正确?即似乎没有任何可以授予或撤销的相关权限。
这是一个死胡同吗?
我有两张桌子。
第一个是带前缀的表
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 脚本,它对每条记录进行大量查询。这个脚本:
从调用表中取一个数字,在循环中从 length(number) 到 1 => $prefix 做子串
执行查询: select count(*) from prefixes where code like '$prefix'
第一个问题是查询计数 - 它是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
在 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)
::/0?postgresql ×10
performance ×3
datatypes ×2
index ×2
migration ×1
sequence ×1
timezone ×1
update ×1