标签: postgresql

PostgreSQL 9.0 Replication 和 Slony-I 有什么区别?

Slony-I还有用吗,如果有,它是什么?为了澄清起见,从 9.0 Postgresql 开始支持内置流复制。

postgresql replication

10
推荐指数
1
解决办法
1909
查看次数

Postgres - 创建带有外键约束的表太慢

我有一个名为“Account”的表,它是一个经常使用的表,有 17 列,有超过 300,000 行。我正在尝试创建一个新表“NewTable”,它对“Account”表具有外键约束。

我的 CREATE TABLE 语句如下所示:

CREATE TABLE "NewTable"
   (
       "column1" VARCHAR(100) NOT NULL,
       "column2" INTEGER NOT NULL,
       PRIMARY KEY("column1")
       CONSTRAINT "SomeFK" FOREIGN KEY ("column2") REFERENCES "Account" ("ID")
    )
Run Code Online (Sandbox Code Playgroud)

上述语句执行了超过 25 分钟并没有完成。我们终止了交易。

当我们移除外键约束时,它会立即执行。

有人可以让我们知道是什么问题吗?我们最初认为它出于某种原因锁定了“Account”表,但是当我们查看“pg_locks”时,我们没有找到“Account”的任何条目——只有“NewTable”的独占锁。

postgresql foreign-key

10
推荐指数
1
解决办法
6911
查看次数

转换测量单位

希望为一系列物质计算最合适的计量单位,其中物质以不同(但兼容)的单位体积给出。

单位换算表

单位转换表存储各种单位以及这些单位之间的关系:

id  unit          coefficient                 parent_id
36  "microlitre"  0.0000000010000000000000000 37
37  "millilitre"  0.0000010000000000000000000 5
 5  "centilitre"  0.0000100000000000000000000 18
18  "decilitre"   0.0001000000000000000000000 34
34  "litre"       0.0010000000000000000000000 19
19  "dekalitre"   0.0100000000000000000000000 29
29  "hectolitre"  0.1000000000000000000000000 33
33  "kilolitre"   1.0000000000000000000000000 35
35  "megalitre"   1000.0000000000000000000000 0
Run Code Online (Sandbox Code Playgroud)

按系数排序表明将parent_id子单元与其上级数值联系起来。

可以使用以下命令在 PostgreSQL 中创建此表:

CREATE TABLE unit_conversion (
  id serial NOT NULL, -- Primary key.
  unit text NOT NULL, -- Unit of measurement name.
  coefficient numeric(30,25) NOT NULL DEFAULT 0, -- Conversion value.
  parent_id integer …
Run Code Online (Sandbox Code Playgroud)

postgresql plpgsql postgresql-9.1 number-formatting

10
推荐指数
1
解决办法
4597
查看次数

让 Postgresql 接受 1 和 0 作为布尔值的真假

我有一个大文件转储 sql 数据加载到 postgresl (600mb+)。在该转储中,布尔值 true 和 false 的字段被表示为 1 和 0,不带引号。尝试将它们加载到 postgresql 中,导致抱怨,因为它不知道如何投射它们。

像这样加载...

psql --disable-triggers -1 -f /foo/bar/dump.sql
Run Code Online (Sandbox Code Playgroud)

由于大量的数据和布尔字段的散布 - 正则表达式通过适当地用真/假替换它们已被证明是不切实际的。

经过多次谷歌搜索后,我无法找到一种方法让 postgresql 在此数据加载期间接受 = true 和 0 = false。看起来很简单,但显然不是!

希望有人确切地知道如何解决它并可以帮助我!

postgresql

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

为什么 jsonb 列上的 gin 索引会减慢我的查询速度,我该怎么办?

初始化测试数据:

CREATE EXTENSION IF NOT EXISTS pgcrypto;
CREATE TABLE docs (data JSONB NOT NULL DEFAULT '{}');
-- generate 200k documents, ~half with type: "type1" and another half with type: "type2", unique incremented index and random uuid per each row
INSERT INTO docs (data)
SELECT json_build_object('id', gen_random_uuid(), 'type', (CASE WHEN random() > 0.5 THEN 'type1' ELSE 'type2' END) ,'index', n)::JSONB
FROM generate_series(1, 200000) n;
-- inset one more row with explicit uuid to query by it later
INSERT INTO docs (data) …
Run Code Online (Sandbox Code Playgroud)

postgresql postgresql-9.4

10
推荐指数
1
解决办法
5808
查看次数

psql: SELECT * ... 除了一列

我寻找一种简单的方法来选择除 psql 中的一列之外的所有列。

随着psql我的意思是交互式命令行。

我会很高兴有一个工具可以扩展到*引用的列名列表。然后我可以移除列以手动移除。

我的问题只是关于 psql 的交互使用。它不是那些对 sql 标准不满意并且想要执行诸如“select *-foo”之类的问题的人的问题的重复。

postgresql psql

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

报告的索引大小与执行计划中的缓冲区数量之间存在巨大的不匹配

问题

我们有一个类似的查询

SELECT COUNT(1) 
  FROM article
  JOIN reservation ON a_id = r_article_id 
 WHERE r_last_modified < now() - '8 weeks'::interval 
   AND r_group_id = 1 
   AND r_status = 'OPEN';
Run Code Online (Sandbox Code Playgroud)

由于它经常遇到超时(10 分钟后),我决定调查这个问题。

EXPLAIN (ANALYZE, BUFFERS)输出如下所示:

 Aggregate  (cost=264775.48..264775.49 rows=1 width=0) (actual time=238960.290..238960.291 rows=1 loops=1)
   Buffers: shared hit=200483 read=64361 dirtied=666 written=8, temp read=3631 written=3617
   I/O Timings: read=169806.955 write=0.154
   ->  Hash Join  (cost=52413.67..264647.65 rows=51130 width=0) (actual time=1845.483..238957.588 rows=21644 loops=1)
         Hash Cond: (reservation.r_article_id = article.a_id)
         Buffers: shared hit=200483 read=64361 dirtied=666 written=8, temp read=3631 written=3617
         I/O …
Run Code Online (Sandbox Code Playgroud)

postgresql index execution-plan postgresql-9.3

10
推荐指数
1
解决办法
432
查看次数

行可见性究竟是如何确定的?

在最简单的情况下,当我们向表中插入新行(并且事务提交)时,它将对所有后续事务可见。请参阅xmax此示例中的 0:

CREATE TABLE vis (
  id serial,
  is_active boolean
);

INSERT INTO vis (is_active) VALUES (FALSE);

SELECT ctid, xmin, xmax, * FROM vis;

  ctid ?xmin ? xmax ? id ? is_active 
?????????????????????????????????????
 (0,1) ?2699 ?    0 ?  1 ? f
Run Code Online (Sandbox Code Playgroud)

当我们更新它时(因为该标志是FALSE偶然设置的),它会发生一些变化:

UPDATE vis SET is_active = TRUE;

SELECT ctid, xmin, xmax, * FROM vis;

 ctid ? xmin ? xmax ? id ? is_active 
?????????????????????????????????????
(0,2) ? 2700 ?    0 ?  1 ? t
Run Code Online (Sandbox Code Playgroud)

根据PostgreSQL 使用的 …

postgresql transaction-log mvcc

10
推荐指数
2
解决办法
899
查看次数

在 PostgreSQL 中,行顺序是否保留在函数和 CTE 中?

在 SELECT 语句中,如果未指定 ORDER BY 子句,则不能保证返回行的顺序。这适用于“普通”表。

对于使用 WITH 表达式 (CTE) 生成的有序表也是如此吗?函数返回的有序表?我认为不是。这是文档中明确说明的地方吗?

具体来说,我可以假设这个(更有效的)查询:

WITH ordered AS ( SELECT * FROM table1 ORDER BY col1 )
SELECT sum(col2) result FROM
generate_series(0,50) nr,
LATERAL (SELECT * FROM ordered LIMIT 100 OFFSET nr*100) a
GROUP BY nr ORDER BY nr;
Run Code Online (Sandbox Code Playgroud)

将等同于这个查询:

SELECT sum(col2) result FROM
generate_series(0,50) nr,
LATERAL (SELECT * FROM table1 ORDER BY col1 LIMIT 100 OFFSET nr*100) a
GROUP BY nr ORDER BY nr;
Run Code Online (Sandbox Code Playgroud)

对于函数:

如果我有这样的功能:

CREATE FUNCTION do_sort(name text[]) RETURNS TABLE(name …
Run Code Online (Sandbox Code Playgroud)

postgresql order-by

10
推荐指数
1
解决办法
2983
查看次数

为什么 PostgreSQL 在禁止 NULL 的域中允许 NULL?

PostgreSQL 允许NULL在标记为 的域中使用s NOT NULL。这是为什么,文档是这么说的,

尽管存在这样的约束,但名义上属于域类型的列仍有可能读取为空。例如,如果域列位于外连接的可为空一侧,则这可能发生在外连接查询中。

这能更好地解释吗?

postgresql null domain

10
推荐指数
1
解决办法
686
查看次数