标签: postgresql

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
查看次数

如何运行特定版本(8.4、9.1)的 postgresql pg_* 命令(例如 pg_dump)

我安装了 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 上运行。

postgresql ubuntu

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

对值为 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
查看次数

PostgreSQL 用户更改密码后无法连接到服务器

我已经用我创建的 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 帐户登录,在登录角色中右键单击用户,转到“定义”选项卡并输入密码

postgresql pgadmin-3

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

收听/通知权限

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

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

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

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

这是一个死胡同吗?

postgresql postgresql-9.2

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

Postgresql 函数来创建表

我想创建一个函数,以便创建一个具有特定结构的表,将表名的一部分作为参数传递,因此表名是 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)

是否可以?

postgresql plpgsql functions postgresql-9.2

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

寻找最长前缀的算法

我有两张桌子。

第一个是带前缀的表

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万
查看次数