标签: postgresql

PostgreSQL 中 UniProt 的生物序列

在 PostreSQL 中存储 UniProt 生物序列的最佳方法是什么?

数据详情

  • 我们从UniProt 中提取了 1200 万个序列——这个数字可能每 3-10 个月翻一番。
  • 序列的长度可以从 10 到 500 亿个字符不等
  • 少于 1% 的序列长度超过 1 万个字符
    • 单独存储较长的序列会提高性能吗?
  • 序列可以是蛋白质或 DNA 字母表
    • DNA 字母表有 5 个字符(A、T、C、G 或 -)。
    • 蛋白质字母表将有大约 30 个字符。
    • 我们不介意将两个不同字母的序列存储在不同的列甚至不同的表中。那会有帮助吗?

数据访问详情

回答 Jeremiah Peschka 的评论:

  • 蛋白质和 DNA 序列将在不同时间访问
  • 不需要在序列内搜索(这是在 db 之外完成的)
  • 是一次访问单行还是按 ID 拉出多组行。我们不需要扫描行。所有序列都被其他表引用——数据库中存在几个具有生物学意义和按时间顺序排列的层次结构。

向后兼容

如果能够继续将以下散列函数(SEGUID - SEquence Globally Unique IDentifier)应用于序列,那就太好了。

CREATE OR REPLACE FUNCTION gfam.get_seguid(p_sequence character varying)
  RETURNS character varying AS
$BODY$
declare
  result varchar := null;
  x integer; …
Run Code Online (Sandbox Code Playgroud)

postgresql

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

如何在 Postgres 中获取窗口函数的聚合?

我有一个表,其中包含两列整型数组的排列/组合,第三列包含一个值,如下所示:

CREATE TABLE foo
(
  perm integer[] NOT NULL,
  combo integer[] NOT NULL,
  value numeric NOT NULL DEFAULT 0
);
INSERT INTO foo
VALUES
( '{3,1,2}', '{1,2,3}', '1.1400' ),
( '{3,1,2}', '{1,2,3}', '0' ),
( '{3,1,2}', '{1,2,3}', '1.2680' ),
( '{3,1,2}', '{1,2,3}', '0' ),
( '{3,1,2}', '{1,2,3}', '1.2680' ),
( '{3,1,2}', '{1,2,3}', '0' ),
( '{3,1,2}', '{1,2,3}', '0' ),
( '{3,1,2}', '{1,2,3}', '1.2680' ),
( '{3,1,2}', '{1,2,3}', '0.9280' ),
( '{3,1,2}', '{1,2,3}', '0' ),
( '{3,1,2}', '{1,2,3}', '1.2680' ),
( …
Run Code Online (Sandbox Code Playgroud)

postgresql aggregate window-functions

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

在 PostgreSQL 8.4 中执行触发器函数需要什么权限?

在 PostgreSQL 8.4 中执行触发器函数需要什么权限?

似乎为角色设置的权限与执行触发器功能无关。我想我有一天看到执行触发器函数所需的特权是 EXECUTE 特权,但对于表的所有者,而不是执行触发调用触发器函数的触发器的操作的实际角色。

我找不到解释这一点的文档部分,有什么帮助吗?

postgresql trigger stored-procedures permissions postgresql-8.4

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

如何使用PostgreSQL保持每行唯一的计数器?

我需要在 document_revisions 表中保留一个唯一的(每行)修订号,其中修订号的范围仅限于文档,因此它不是整个表唯一的,仅适用于相关文档。

我最初想出了类似的东西:

current_rev = SELECT MAX(rev) FROM document_revisions WHERE document_id = 123;
INSERT INTO document_revisions(rev) VALUES(current_rev + 1);
Run Code Online (Sandbox Code Playgroud)

但是有一个竞争条件!

我试图用 解决它pg_advisory_lock,但文档有点稀缺,我不完全理解它,我不想错误地锁定某些东西。

以下是可以接受的,还是我做错了,或者有更好的解决方案?

SELECT pg_advisory_lock(123);
current_rev = SELECT MAX(rev) FROM document_revisions WHERE document_id = 123;
INSERT INTO document_revisions(rev) VALUES(current_rev + 1);
SELECT pg_advisory_unlock(123);
Run Code Online (Sandbox Code Playgroud)

我不应该为给定的操作 (key2) 锁定文档行 (key1) 吗?所以这将是正确的解决方案:

SELECT pg_advisory_lock(id, 1) FROM documents WHERE id = 123;
current_rev = SELECT MAX(rev) FROM document_revisions WHERE document_id = 123;
INSERT INTO document_revisions(rev) VALUES(current_rev + 1);
SELECT pg_advisory_unlock(id, 1) FROM …
Run Code Online (Sandbox Code Playgroud)

postgresql locking

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

PostgreSQL 事务提交数小时

我遇到了一个问题,即我有两个从用户到我的 PostgreSQL 服务器的连接,这些连接已经运行了大约 4 个小时并且已经处于提交状态相当长一段时间(我一直在观看它至少 1 小时) . 这些连接会阻止其他查询运行,但它们本身并未被阻止。

这是有问题的两个连接。

postgres=# select * from pg_stat_activity where usename = 'xxxxx';
 datid | datname | procpid | usesysid | usename | current_query | waiting |          xact_start           |          query_start          |         backend_start         |  client_addr  | client_port
-------+---------+---------+----------+---------+---------------+---------+-------------------------------+-------------------------------+-------------------------------+---------------+-------------
 20394 | xxxxxx  |   17509 |    94858 | xxxxx   | COMMIT        | f       | 2014-01-30 05:51:11.311363-05 | 2014-01-30 05:51:12.042515-05 | 2014-01-30 05:51:11.294444-05 | xx.xx.xxx.xxx |       63531
 20394 | xxxxxx  |    9593 |    94858 | xxxxx   | COMMIT …
Run Code Online (Sandbox Code Playgroud)

postgresql linux postgresql-8.4

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

如何正确监控PostgreSQL数据库连接数?

我尝试使用 Nagios 脚本来监视 Postgres 数据库上的数据库连接数,但我遇到了这个问题:这些连接数被视为当前打开的连接数,每 5 分钟测量一次。

SELECT sum(numbackends) FROM pg_stat_database;
Run Code Online (Sandbox Code Playgroud)

尽管如此,这似乎错过了大量的短期连接,因此统计数据与现实相去甚远。

我尝试手动运行脚本,我观察到即使在两个连接之间发生了很大的变化,彼此之间的距离也只有几秒钟。

我怎样才能以可靠的方式获得这些信息?像 max(connectios) 发生在一个时间间隔内。

postgresql performance monitoring

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

如何在标准 SQL 或 T-SQL 中生成 1, 2, 3, 3, 2, 1, 1, 2, 3, 3, 2, 1, ... 系列?

给定两个数字nand m,我想生成一系列的形式

1, 2, ..., (n-1), n, n, (n-1), ... 2, 1
Run Code Online (Sandbox Code Playgroud)

并重复它m几次。

例如,对于n = 3and m = 4,我想要以下 24 个数字的序列:

1, 2, 3, 3, 2, 1, 1, 2, 3, 3, 2, 1, 1, 2, 3, 3, 2, 1, 1, 2, 3, 3, 2, 1
----------------  ----------------  ----------------  ----------------
Run Code Online (Sandbox Code Playgroud)

我知道如何通过以下两种方法之一在 PostgreSQL 中实现此结果:

使用以下查询,该查询使用该generate_series函数,以及一些确保订单正确的技巧:

WITH parameters (n, m) AS
(
    VALUES (3, 5)
)
SELECT 
    xi
FROM
(
    SELECT
        i, i …
Run Code Online (Sandbox Code Playgroud)

postgresql sql-server t-sql functions

11
推荐指数
4
解决办法
7402
查看次数

从 JSON 对象创建 UNIQUE 约束

让我们以表 peoples 为例,它只有 2 个字段:id 和 data(json)。

SELECT data FROM peoples ;
{"name": "Adam","pos":"DBA","age":22 }
{"name": "Alice","pos":"Security","age":33 }
{"name": "Bob","pos":"Manager","age":42 }
Run Code Online (Sandbox Code Playgroud)

我想为“pos”字段创建约束,它必须是唯一的。我在互联网上搜索了 JSON 约束,但没有结果。

我该如何处理这个问题?

postgresql json unique-constraint

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

创建 PostgreSQL 约束以防止唯一组合行

想象一下你有一个简单的表:

name | is_active
----------------
A    | 0
A    | 0
B    | 0
C    | 1
...  | ...
Run Code Online (Sandbox Code Playgroud)

我需要创建一个特殊的唯一约束,该约束在以下情况下失败:相同is_active值不能共存不同的name值。

允许条件示例:

注意:简单的多列唯一索引不允许这样的组合。

A    | 0
A    | 0
B    | 0
Run Code Online (Sandbox Code Playgroud)

允许条件示例:

A    | 0
B    | 1
Run Code Online (Sandbox Code Playgroud)

失败条件示例:

A    | 0
A    | 1
-- should be prevented, because `A 0` exists
-- same name, but different `is_active`
Run Code Online (Sandbox Code Playgroud)

理想情况下,我需要唯一约束或唯一部分索引。触发器对我来说更成问题。

双重A,0允许,但(A,0) (A,1)不是。

postgresql exclusion-constraint

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

如何在 PostgreSQL pgAdmin 4 中备份/恢复?

所以我觉得这应该是非常基本和容易做的事情,也许我只是没有正确地做事。

我想做相当于 SQL Server 备份的工作。我想创建一个完整的 .bak 文件并能够将数据库恢复到其原始状态。

到目前为止,我已经在 PgAdmin4 中尝试了许多不同的方法来从新创建的数据库创建备份文件。我迁移创建了一堆表的模式,然后对之前创建的文件执行还原。我期望恢复后我创建的所有表都消失了,我希望数据库处于我进行备份时的确切状态。

我尝试了许多不同的选项,例如包括在备份/恢复时保留/不保存数据的创建/删除数据库命令,但没有运气。

任何人都可以帮助我吗?

我正在使用命令pg_dump mydb -Fc > dbpg_restore db. 也许我缺少一些神奇的参数来完成我上面的要求?

试过了pg_restore --clean db,结果一样。

问题是我创建了我的数据库,里面什么都没有,备份它,创建一些表,恢复备份,我创建的表仍然存在。我想要一个恢复方法,使数据库处于与备份时相同的状态。

postgresql pgadmin restore

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