标签: postgresql

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

有没有办法将 PostgreSQL 数据库直接存储在块设备(而不是文件系统)上?

我正在阅读 PostgreSQL 在哪里存储它需要为我提供服务的数据(这里:http : //www.postgresql.org/docs/8.4/static/storage-file-layout.html

正如它所写的那样,PostgreSQL 的数据和存储似乎在我存储PGDATA文件夹的相应文件系统之上工作。在这个文件夹中,数据再次存储在一组单独的文件中(即每个数据库的文件)。

问题: 虽然我可以接受这样的“文件系统内设置”,

我想知道是否可以将 PostgreSQL 设置为直接在 POSIX 系统上使用块设备(如 /dev/sda)进行数据存储?

我认为这会提供一些优势:

  • 使数据库适合文件系统的块大小配置和优化不再需要考虑
  • 可以避免文件系统中的开销
  • 备份可以更简单

如果不是 PostgreSQL,是否有已知的数据库应用程序不依赖于将其数据保存为文件文件系统,而是直接使用块设备?

postgresql

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

Postgres 继承分区表的索引

我有一个包含大约 6000 万行的表,我按状态将其划分为 53 个子表。这些表像这样“继承”大表:

CREATE TABLE b2b_ak (LIKE b2b including indexes, CHECK ( state = 'AK') ) INHERITS (b2b8) TABLESPACE B2B;

我的问题是:如果在复制语句完成之前我不在 b2b8 上构建索引,子表是否继承索引?换句话说,我想这样做:

Create b2b8
Create b2b8_ak inherits b2b8
COPY b2b8 FROM bigcsvfile.csv
CREATE INDEX CONCURRENTLY
Run Code Online (Sandbox Code Playgroud)

并让整个事情结果在子表上创建了所有索引。

postgresql index copy

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

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

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

问题

我们有一个类似的查询

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

为空时 Postgresql 返回 0

我正在尝试使用运行查询,MAX()但我的问题是,如果该字段包含一个NULL值,则数据不返回任何内容。更新表不是一个选项,那么这个查询应该如何重写以返回 0 时NULL

下面的示例 DDL - 我硬编码了一个WHERE不返回任何内容的子句,仅用于说明目的,理想情况下我想为用户返回所有usernames和最高logincount

CREATE TABLE Test 
(
 username varchar(50) not null,
 logincount int,
 logindate Date
);

Insert Into Test (username, logincount, logindate) 
VALUES
('er11', 1, '2017-01-01'), ('er11', 2, '2017-01-02'), ('ff12', NULL, NULL)
,('jb88', 1, '2017-01-09');

With maxlogincount As
(
    select max(logincount) As "MaxLoginCount"
    ,username
    FROM Test
    GROUP BY username
)
Select
username
,logincount
,logindate
FROM Test t
inner join maxlogincount mlc
ON t.username = …
Run Code Online (Sandbox Code Playgroud)

postgresql postgresql-9.3

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

使用 CREATE TABLE AS SELECT 如何指定 WITH 条件 (CTE)?

PostgreSQL 中有一个旧的和不推荐使用的命令,它早于CREATE TABLE AS SELECT(CTAS)称为SELECT ... INTO .... FROM,它支持WITH子句/公共表表达式(CTE)。所以,例如,我可以做到这一点..

WITH w AS (
  SELECT *
  FROM ( VALUES (1) ) AS t(x)
)
SELECT *
INTO foo
FROM w;
Run Code Online (Sandbox Code Playgroud)

但是,我不能这样做..

WITH w AS (
  SELECT *
  FROM ( VALUES (1) ) AS t(x)
)
CREATE TABLE foo AS
SELECT * FROM w;
Run Code Online (Sandbox Code Playgroud)

或者,我得到

ERROR:  syntax error at or near "CREATE"
LINE 5: CREATE TABLE foo AS
Run Code Online (Sandbox Code Playgroud)

我将如何使用标准化的 CTAS 语法来做到这一点。

postgresql syntax cte sql-standard ctas

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

没有重复行的左连接

我有两个表叫做recordrecord_history。对于每条记录,可能有多个历史记录。它们可以通过id和 连接record_id。我想record用最近的record_history数据获取所有的条目。我已经创建了这样的查询,

SELECT rec.id, rec.name, rech1.data AS last_history_data
FROM record rec
LEFT OUTER JOIN record_history rech1 ON (rec.id = rech1.record_id)
LEFT OUTER JOIN record_history rech2 ON (rec.id = rech2.record_id AND rech2.ts > rech1.ts)
WHERE rech2.id IS NULL
ORDER BY rec.id DESC
Run Code Online (Sandbox Code Playgroud)

在这里,我通过ts. 只要没有重复的ts条目,这就会起作用。如果最近的时间戳在 中重复record_history,则此查询将返回多于一行的记录。我们如何在左连接上应用限制来限制重复行?

postgresql greatest-n-per-group

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

大表的高效分页

使用PostgreSQL 10.5。我正在尝试创建一个分页系统,用户可以在其中来回切换各种结果。

为了不使用OFFSET,我id在名为p(prevId)的参数中从上一页的最后一行传递了。然后我选择id高于p参数中传递的数字的前三行。(如本文所述

例如,如果id上一页的最后一行是 5,我会选择前 3 行的 anid大于 5:

SELECT 
  id, 
  firstname, 
  lastname 
FROM 
  people 
WHERE 
  firstname = 'John'
  AND id > 5 
ORDER BY 
  ID ASC 
LIMIT 
  3;
Run Code Online (Sandbox Code Playgroud)

这很好用,而且时机也不错:

Limit  (cost=0.00..3.37 rows=3 width=17) (actual time=0.046..0.117 rows=3 loops=1)
   ->  Seq Scan on people  (cost=0.00..4494.15 rows=4000 width=17) (actual time=0.044..0.114 rows=3 loops=1)
         Filter: ((id > 5) AND (firstname = 'John'::text))
         Rows Removed by Filter: …
Run Code Online (Sandbox Code Playgroud)

postgresql performance index paging postgresql-10 query-performance

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

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

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

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

这能更好地解释吗?

postgresql null domain

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