我需要将二进制数据文件存储在运行在 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类型,可以存储任意长度的字符串。
似乎这两种数据类型是等效的,但它并不明确......有关此的更多信息?
谢谢你,尼科
我安装了 Postgresql 8.4 和 9.1 版。对于任何给定的 Postgresql 命令,如何指定要运行的命令的特定版本?(例如, psql, pg_dump, pg_ctlcluster, pg_restore, ...)
我的问题是想要做一个 pg_dump 以准备从 8.4 升级到 9.1,我想知道我正在运行哪个 pg_dump 版本。
我在 Ubuntu 10.04 Natty 上运行。
我有一个名为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) 我已经用我创建的 4 个角色遇到了这个问题:
使用 GUI (1) 在 pgAdmin III 中更改用户的密码后,该用户无法再登录。
pgAdmin III 显示错误信息:
An error has occurred:
Error connecting to the server: FATAL: password authentication failed for user "sam"
FATAL: password authentication failed for user "sam"
Run Code Online (Sandbox Code Playgroud)
我的系统:Ubuntu 12.04 上的 Postgresql 9.2
有没有什么办法解决这一问题?
(1): 使用 postgres 帐户登录,在登录角色中右键单击用户,转到“定义”选项卡并输入密码
我有一个 postgres 数据库,有两个用户;爱丽丝和鲍勃。
我希望能够做到这一点,NOTIFY alice_channel 'sensitive data'而鲍勃无法LISTEN通过猜测频道名称是“alice_channel”而偷偷摸摸地进入。
在实践中,频道名称是很难猜测,但是这是安全通过朦胧的最好的。
我认为没有办法阻止数据库用户使用(滥用)LISTEN&NOTIFY是否正确?即似乎没有任何可以授予或撤销的相关权限。
这是一个死胡同吗?
我想创建一个函数,以便创建一个具有特定结构的表,将表名的一部分作为参数传递,因此表名是 t_ 。与此类似:
CREATE OR REPLACE FUNCTION create_table_type1(t_name VARCHAR(30)) RETURNS VOID AS $$
BEGIN
EXECUTE "CREATE TABLE IF NOT EXISTS t_"|| t_name ||"
(
id SERIAL,
customerid INT,
daterecorded DATE,
value DOUBLE PRECISION,
PRIMARY KEY (id)
)"
END
$$ LANGUAGE plpgsql
Run Code Online (Sandbox Code Playgroud)
然后像这样调用它:
SELECT create_table_type1('one');
Run Code Online (Sandbox Code Playgroud)
是否可以?
我有两张桌子。
第一个是带前缀的表
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
index ×2
performance ×2
datatypes ×1
functions ×1
pgadmin-3 ×1
plpgsql ×1
ubuntu ×1