标签: postgresql

PostgreSQL:如何在同一数据库中创建数据库模式的完整副本?

如何将我的public模式复制到具有完整表结构、数据、函数、fk、pk 等的同一个数据库中。
我的 Postgres 版本是 8.4
PS 我需要复制模式而不是数据库

postgresql

28
推荐指数
5
解决办法
9万
查看次数

空间索引可以帮助“范围-排序-限制”查询吗

问这个问题,特别是针对 Postgres,因为它对 R 树/空间索引有很好的支持。

我们有下表,其中包含单词及其频率的树结构(嵌套集模型):

lexikon
-------
_id   integer  PRIMARY KEY
word  text
frequency integer
lset  integer  UNIQUE KEY
rset  integer  UNIQUE KEY
Run Code Online (Sandbox Code Playgroud)

和查询:

SELECT word
FROM lexikon
WHERE lset BETWEEN @Low AND @High
ORDER BY frequency DESC
LIMIT @N
Run Code Online (Sandbox Code Playgroud)

我认为覆盖索引(lset, frequency, word)会很有用,但我觉得如果范围内的lset值太多,它可能表现不佳(@High, @Low)

(frequency DESC)有时,当使用该索引的搜索早期产生@N与范围条件匹配的行时,一个简单的索引也可能就足够了。

但似乎性能在很大程度上取决于参数值。

有没有办法让它快速执行,不管范围(@Low, @High)是宽还是窄,也不管高频词是否幸运地在(窄)选择的范围内?

R-tree/空间索引有帮助吗?

添加索引,重写查询,重新设计表,没有限制。

postgresql performance index database-design query-performance

28
推荐指数
2
解决办法
4312
查看次数

将 postgresql 数据移动到不同的驱动器

我使用 AWS 作为我的云环境。我将 PostgreSQL 安装在与根实例卷相同的驱动器上。我已将第二个驱动器连接并安装到我的实例上。现在我想将我所有的 PostgreSQL 数据移动到不同的驱动器。我仍处于开发模式,因此如果此时可以更轻松地传输旧数据,我可以删除旧数据。做这个的最好方式是什么?

PostgreSQL 表空间是我应该看的东西吗?

postgresql tablespaces postgresql-9.1

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

结合使用 MongoDB 和 PostgreSQL

我目前的项目本质上是一个工厂文件管理系统的运行。

也就是说,有一些皱纹(惊喜,惊喜)。虽然有些问题是项目特有的,但我相信有一些普遍的观察结果和问题没有规范的答案(无论如何我可以找到)并且适用于更广泛的问题领域. 这里有很多,我不确定它是否适合 StackExchange Q&A 格式,但我认为它 a) 一个可回答的问题和 b) 不够具体,它可以使社区受益。我的一些考虑是特定于我的,但我认为这个问题对任何面临决定 SQL 还是 NoSQL 还是两者的人都有用。

背景:

我们正在构建的 Web 应用程序包含本质上具有明显关系的数据以及面向文档的数据。我们想吃蛋糕,也想吃。

TL;DR:我认为下面的 #5 通过了气味测试。你?有没有人有将 SQL 和 NOSQL 集成到单个应用程序中的经验?我试图在下面列出解决此类问题的所有可能方法。我错过了一个有前途的替代方案吗?

复杂性:

  • 有许多不同类别的文档。这些要求已经需要数十种不同的文件。这个数字只会上升。最好的情况是,我们可以利用简单的领域特定语言、代码生成和灵活的模式,以便领域专家可以在没有 DBA 或程序员干预的情况下处理新文档类的添加。(注意:已经意识到我们正在实践Greenspun 的第十条规则
  • 以前成功写入的完整性是项目的核心要求。这些数据对业务至关重要。可以牺牲写入的完整 ACID 语义,前提是成功写入的内容保持写入状态。
  • 文件本身很复杂。在我们的特定案例中,原型文档需要为每个文档实例存储 150 多个不同的数据片段。病理情况可能会更糟一个数量级,但肯定不是两个。
  • 一类文档是一个移动的目标,在稍后的时间点会更新。
  • 当我们将 Django 连接到关系数据库时,我们喜欢从 Django 获得的免费东西。我们希望保留免费赠品,而不必跳回两个 Django 版本来使用 django-nonrel fork。完全转储 ORM 比降级到 1.3 更可取。

从本质上讲,它是关系数据(您的典型 Web 应用程序内容,如用户、组等,以及我们需要能够实时对复杂查询进行切片和切块的文档元数据)和文档数据(例如我们没有兴趣加入或查询的数百个字段 - 我们对数据的唯一用例将是显示输入的单个文档)。

我想对我的首选方法进行完整性检查(如果你检查我的发帖历史,我非常明确地说明我不是 DBA),并列举我遇到的所有选项供其他人解决涉及关系和非关系数据的广泛相似的问题。

建议的解决方案:

1. 每个文档类一张表

每个文档类都有自己的表,其中包含所有元数据和数据的列。

好处:

  • 标准 SQL 数据模型正在发挥作用。
  • 以最好的方式处理关系数据。如果需要,我们稍后会进行非规范化。
  • Django 的内置管理界面可以轻松地检查这些表,并且 ORM 可以 100% 使用开箱即用的数据。

缺点:

  • 维修噩梦。数十(数百?)个表(数十?)数千列。
  • 应用程序级逻辑负责准确决定要写入哪个表。将表名作为查询的参数很糟糕。
  • 基本上所有业务逻辑更改都需要架构更改。
  • 病理情况可能需要为跨多个表的单个表单条带化数据(请参阅:PostgreSQL …

rdbms postgresql document-oriented mongodb

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

在大型 PostgresSQL 表中提高 COUNT/GROUP-BY 的性能?

我正在运行 PostgresSQL 9.2 并且有一个 12 列的关系,大约有 6,700,000 行。它包含 3D 空间中的节点,每个节点都引用一个用户(创建它的人)。要查询哪个用户创建了多少个节点,我执行以下操作(添加explain analyze以获取更多信息):

EXPLAIN ANALYZE SELECT user_id, count(user_id) FROM treenode WHERE project_id=1 GROUP BY user_id;
                                                    QUERY PLAN                                                         
---------------------------------------------------------------------------------------------------------------------------
 HashAggregate  (cost=253668.70..253669.07 rows=37 width=8) (actual time=1747.620..1747.623 rows=38 loops=1)
   ->  Seq Scan on treenode  (cost=0.00..220278.79 rows=6677983 width=8) (actual time=0.019..886.803 rows=6677983 loops=1)
         Filter: (project_id = 1)
 Total runtime: 1747.653 ms
Run Code Online (Sandbox Code Playgroud)

如您所见,这大约需要 1.7 秒。考虑到数据量,这还算不错,但我想知道这是否可以改进。我尝试在用户列上添加 BTree 索引,但这没有任何帮助。

您有其他建议吗?


为了完整起见,这是完整的表定义及其所有索引(没有外键约束、引用和触发器):

    Column     |           Type           |                      Modifiers                    
---------------+--------------------------+------------------------------------------------------
 id            | bigint                   | not null default nextval('concept_id_seq'::regclass)
 user_id       | bigint …
Run Code Online (Sandbox Code Playgroud)

postgresql performance index count group-by

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

在数据库中强制执行“至少一个”或“恰好一个”的约束

假设我们有用户,每个用户可以有多个电子邮件地址

CREATE TABLE emails (
    user_id integer,
    email_address text,
    is_active boolean
)
Run Code Online (Sandbox Code Playgroud)

一些示例行

user_id | email_address | is_active
1       | foo@bar.com   | t
1       | baz@bar.com   | f
1       | bar@foo.com   | f
2       | ccc@ddd.com   | t
Run Code Online (Sandbox Code Playgroud)

我想强制执行一个约束,即每个用户都只有一个活动地址。我怎样才能在 Postgres 中做到这一点?我可以这样做:

CREATE UNIQUE INDEX "user_email" ON emails(user_id) WHERE is_active=true;
Run Code Online (Sandbox Code Playgroud)

这可以防止用户拥有多个活动地址,但我相信不会防止他们的所有地址都设置为 false。

如果可能的话,我更愿意避免使用触发器或 pl/pgsql 脚本,因为我们目前没有这些脚本,而且设置起来会很困难。但我很感激知道“唯一的方法是使用触发器或 pl/pgsql”,如果是这样的话。

postgresql database-design constraint referential-integrity ddl

28
推荐指数
3
解决办法
8683
查看次数

更改实时生产数据库上的表

大多数“流行”(MySQL、Postgres...)数据库系统如何处理实时生产数据库上的表更改(例如添加、删除或更改列的类型)?

我知道正确的方法是备份所有计划停机时间,然后进行更改。

但是......当前的数据库系统是否支持在不停止任何事情的情况下“在线”执行这些操作?(也许只是延迟引用刚刚更改/删除的列的查询)

当我只是ALTER TABLE...在实时运行的数据库上执行操作时会发生什么?当这种情况发生时,一切都会停止吗?数据会损坏吗?等等。

同样,我主要指的是 Postgres 或 MySQL,因为这些是我遇到的。

(而且,是的,在我以“正确的方式”做之前,任何时候我必须这样做,备份事情,安排停机等......但我只想知道是否有可能“快速且脏”或者是否有任何数据库系统实际上支持“快速、实时和脏”模式更改)


有人刚才建议的在线模式修改为MySQL从Facebook脚本(有教程这里和源在这里)......似乎是一个很好的方式来自动执行了一套“哈克”的方式来做到这一点...有没有人用它在类似于生产的东西?

mysql postgresql alter-table

27
推荐指数
3
解决办法
5万
查看次数

查询Postgres中物化视图的定义

我想知道如何在 Postgres 中查询物化视图的定义。作为参考,我希望做的与您可以为常规视图做的非常相似:

SELECT * FROM information_schema.views WHERE table_name = 'some_view';
Run Code Online (Sandbox Code Playgroud)

它为您提供以下列:

table_catalog
table_schema
table_name
view_definition
check_option
is_updatable
is_insertable_into
is_trigger_updatable
is_trigger_deletable
is_trigger_insertable_into
Run Code Online (Sandbox Code Playgroud)

这对于物化视图是可能的吗?

从我目前的研究来看,物化视图似乎被故意排除在 information_schema 之外,因为

information_schema 只能显示存在于 SQL 标准中的对象。

( http://www.postgresql.org/message-id/3794.1412980686@sss.pgh.pa.us )

由于它们似乎完全被排除在 information_schema 之外,我不知道如何解决这个问题,但我想做的是双重的:

  1. 查询特定的物化视图是否存在。(到目前为止,我发现这样做的唯一方法是尝试创建一个具有相同名称的 mat 视图,看看它是否会爆炸。)
  2. 然后查询物化视图的定义(类似于 上的view_definitioninformation_schema.views)。

postgresql materialized-view information-schema postgresql-9.4

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

针对多个值的 PostgreSQL JSON 查询数组

我想针对jsonbPostgres中的类型编写一个查询,给定一组客户 ID 将找到相应的组。

鉴于此示例表:

CREATE TABLE grp(d JSONB NOT NULL);

INSERT INTO grp VALUES
   ('{"name":"First","arr":["foo"], "customers":[{"id":"1", "name":"one"},{"id":"2", "name":"two"}]}')
 , ('{"name":"Second","arr":["foo","bar"], "customers":[{"id":"3", "name":"three"},{"id":"4", "name":"four"}]}')
 , ('{"name":"Third","arr":["bar","baz"], "customers":[{"id":"5", "name":"five"},{"id":"6", "name":"seven"}]}');
Run Code Online (Sandbox Code Playgroud)

我发现了类似的问题(针对多个值的 PostgreSql JSONB SELECT)并设法使用此查询在简单数组上实现了我想要的:

SELECT d FROM grp WHERE d->'arr' ?| ARRAY['foo', 'bar'];
Run Code Online (Sandbox Code Playgroud)

但是,当数组包含 JSON对象时,我无法使其工作:

SELECT d FROM grp WHERE d->'customers' ?| ARRAY['{"id":"1"}', '{"id":"5"}'];
Run Code Online (Sandbox Code Playgroud)

这是我对查询的期望:

grp“第一个”-> 客户“1”

grp "第三" -> 客户 "5"

postgresql array json postgresql-9.4

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

UPSERT 与 ON CONFLICT 使用 UPDATE 部分中的源表中的值

鉴于:

CREATE TABLE A (
PK_A INT8 NOT NULL,
A INT8,
PRIMARY KEY (PK_A)
);

CREATE TABLE B (
PK_B INT8 NOT NULL,
B INT8,
PRIMARY KEY (PK_B)
);
Run Code Online (Sandbox Code Playgroud)

这个查询:

insert into table_b (pk_b, b) 
select pk_a,a from table_a 
on conflict (b) do update set b=a;
Run Code Online (Sandbox Code Playgroud)

导致以下错误:

ERROR:  column "a" does not exist
LINE 1: ...elect pk_a,a from table_a on conflict (b) do update set b=a;
                                                                 ^
HINT:  There is a column named "a" in table "*SELECT*", but it cannot …
Run Code Online (Sandbox Code Playgroud)

postgresql upsert postgresql-9.5

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