标签: postgresql

手动增加 P​​ostgreSQL 的表大小限制为 32 TB?

我需要一个免费的数据库软件并想到 PostgreSQL。但是后来我读到它的表大小限制为 32 TB,但我需要更多(并且不想在 Oracle 等高端数据库软件上花费数千/数百万美元)。

有没有办法手动增加该限制?如果是这样,这样做的惩罚是什么?

postgresql database-size

5
推荐指数
2
解决办法
5202
查看次数

postgres 在制作索引时如何使用模式搜索路径?

使用 Postgres 9.1.4 和 PostGIS 1.5,作为 Rails 3.2.x 应用程序的一部分。

我有一个包含模式 A 和 B 的数据库,模式 A 为空,模式 B 包含表 foo 和 bar,在非 PK 字段中的每个表上都有索引,例如email.

如果我用 设置我的模式搜索路径SET search_path TO A,B;,那么我可以运行:

CREATE TABLE foo (...);
Run Code Online (Sandbox Code Playgroud)

并在模式 A 中创建表 foo。但以下迁移失败:

CREATE TABLE bar (...);
CREATE UNIQUE INDEX index_bar_on_email ON bar USING btree (email);
Run Code Online (Sandbox Code Playgroud)

Index name 'index_bar_on_email' on table 'bar' already exists
Run Code Online (Sandbox Code Playgroud)

这表明create tablecreate unique index处理搜索路径的方式不同。有没有办法哄 PG 在模式 A 中创建索引?

更新

这个问题似乎与 Rails 如何与 Postgres 接口有关。创建 …

postgresql index

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

DROP CONSTRAINT 后主键的索引会发生什么变化?

我正在运行 PostgreSQL 9.1.4。

我有一个包含许多现有行的表,以及一堆其他带有指向它的外键的表,我正在尝试:

1 - 删除当前主键上的 pkey 约束,因为它当前不是串行类型。

2 - 添加一个串行类型的列并将该新列作为主键。

3 - 将步骤 #1 的旧列设置为 UNIQUE 并为所有具有指向我的表的外键的表重新创建外键。事实上,这些表都有两个指向我的表的外键:一个指向当前作为主键的旧列,另一个指向新的串行类型列

我已经成功创建了一个执行此操作的脚本,但我想知道:

a) 在上面的第 1 步删除 pkey 约束是否也会删除与该主键关联的索引?

b)如果没有,有没有办法重用该索引?在第 3 步添加回 UNIQUE 约束后,会创建一个新索引还是使用之前存在的索引?除了创建的新列(串行主键)外,表中没有任何内容被更改。

编辑(一些澄清):

  • 我们将旧的 pk 列称为 OLD_PK,将 to-be-be-be-create-by-my-script 称为新的 pk 列 NEW_PK
  • OLD_PK 列的类型是 INT
  • OLD_PK 列不会也不能被删除(它的信息仍然有价值)因此它也不能将其自身转换为类型序列,现有数据必须保留。
  • 我知道串行是一种快捷方式。就像我说的,我已经想出了一个工作脚本,我和同事不确定的部分是索引以及从这个角度来看它是如何工作的。
  • 之前有一个指向 OLD_PK 的外键的所有表,在执行脚本后,将有一个指向 OLD_PK 的外键(比如“fkey_old_pk”)和另一个指向 NEW_PK 的外键(比如“fkey_new_pk”)

postgresql index database-design primary-key unique-constraint

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

隔离级别是否仅适用于 SELECTS 而不适用于 UPDATES?

根据隔离级别,可能会展示 SELECTS 不同行为的场景:

1) 0:00 Thread A runs a query that returns 1000 rows that takes 5 minutes to complete
2) 0:02 Thread B runs a query that returns the same 1000 rows
3) 0:05 Thread A updates the last 1 rows in this result set and commits them
4) 0:07 Thread B's query returns* 
Run Code Online (Sandbox Code Playgroud)

根据隔离级别,#4 中的结果集要么包含线程 A 的更改,要么不包含。UPDATES 也是如此吗?

下面是一个示例场景:

Thread A: UPDATE... set version=6 ... WHERE primary_key = 1234 AND version = 5
Thread B: UPDATE... set …
Run Code Online (Sandbox Code Playgroud)

mysql postgresql oracle locking

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

从历史记录重建表

我的 PostgreSQL 8.4 数据库发生了一场小灾难。

我在两个表中跟踪访问者访问我的网页:

历史

+---------------+-------------+
| whereseenlast | varchar(50) |
| uniqid        | varchar(13) |
| whenseenlast  | timestamp   |
| bla1          | varchar(10) |
| bla2          | varchar(10) |
| bla3          | varchar(10) |
+---------------+-------------+
Run Code Online (Sandbox Code Playgroud)

样本数据:

+-----------------+---+---------------------+----------+----------+----------+
| where1.html     | 1 | 2000-01-01 00:00:00 | somebla1 | somebla2 | somebla3 |
| where2.html     | 1 | 2005-05-05 05:06:07 | somebla1 | somebla2 | somebla3 |
| where12345.html | 1 | 2012-11-22 11:22:33 | somebla1 | somebla2 | …
Run Code Online (Sandbox Code Playgroud)

postgresql recovery

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

Postgres 可扩展性 - 连接池的影响是什么?

我们有一个关于 Server Fault 的问题,提出了一个有趣的问题:
鉴于 Postgres 9.2 可扩展性改进中的可扩展性改进,使用连接池机制来避免与数据库建立额外连接的开销更好,还是连接提高读取性能的开销值得吗?


将它具体与我的环境相关联:我们有一个以数据库为支持且以读取为中心的 Web 应用程序,我们目前在 Postgres 8.4 上运行。

我们的重新实现将于明年启动,同时升级到 9.2,并为每个 Apache 工作进程提供自己与数据库的连接(因此,它自己的 Postgres 后端会在 Apache 工作人员的生命周期内保留)。
根据我们所看到的,这似乎是连接到数据库的开销和让更多工作人员处理读取负载之间的良好平衡,尽管我们还没有进行任何实质性的基准测试来确认这一点。

该实现看起来是否合理?鉴于最近的可扩展性改进,我们是否应该考虑其他选项/连接池机制?

postgresql scalability

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

自定义 Postgres 功能不起作用

我编写了这个函数,它应该遍历文本数组并将每个元素(这是一个类型转换的整数)转换为十六进制,附加到文本变量,然后返回十六进制。然而,我什么也得不到。

有没有人看到该函数有任何问题会导致它不返回任何内容?

CREATE OR REPLACE FUNCTION array_convert_to_hex(text[])
RETURNS text
AS
$$
DECLARE
   arrInts ALIAS FOR $1;
   retVal text;
BEGIN
   FOR I IN array_lower(arrInts, 1)..array_upper(arrInts, 1) LOOP
    retVal := retVal || lpad(cast(to_hex(arrInts[I]::integer) as varchar), 2, '0');
   END LOOP;
RETURN retVal;
END;
$$
LANGUAGE plpgsql
   STABLE
RETURNS NULL ON NULL INPUT;
Run Code Online (Sandbox Code Playgroud)

postgresql functions

5
推荐指数
2
解决办法
1195
查看次数

错误:找不到数据类型 information_schema.sql_identifier 的数组类型

我正在尝试运行以下 sql 命令:

SELECT ARRAY(
    SELECT column_name 
    FROM information_schema.columns 
    WHERE table_name ='gis_field_configuration_stage'
);
Run Code Online (Sandbox Code Playgroud)

我收到以下错误:

ERROR:  could not find array type for datatype information_schema.sql_identifier
Run Code Online (Sandbox Code Playgroud)

postgresql array catalogs

5
推荐指数
2
解决办法
9274
查看次数

具有 LIMIT 的不同优先级伪列解决方案的性能

我想知道关于stackoverflow问题的答案中提供的解决方案的相对性能,我决定运行一些测试。

在给定一组优先级递减的条件的情况下,OP 希望获得第一个匹配行。两种解决方案都涉及一个伪列,但一个(我的)涉及将多个SELECT语句UNION ALL组合在一起,而另一个则构造了一个CASE表达式。

我分享我的结果,希望有人会发现这很有用。

postgresql performance index execution-plan query-performance

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

使用 PostgreSQL 进行全文搜索

我有一个包含这些行的表:

Stickers
------------------------------------------------------
ID | Title                 |Keywords (ts_vector)
------------------------------------------------------
01 | Sticker Case 580H     |'580h':3 'cas':2 'stick':1
02 | Sticker Case 580L     |'580l':3 'cas':2 'stick':1
03 | Sticker Case 580      |'580':3 'cas':2 'stick':1
04 | Sticker Case Plus 3000|'3000':4 'cas':2 'plus':3 'stick':1
Run Code Online (Sandbox Code Playgroud)

好吧,当我使用这个脚本进行搜索时,只返回第 03 行,我如何返回第 01 和 02 行?

SELECT
*
FROM
stickers
WHERE
keywords @@@ to_tsquery('case & 580');
Run Code Online (Sandbox Code Playgroud)

postgresql full-text-search postgresql-9.2

5
推荐指数
2
解决办法
2145
查看次数