我有一个大文件转储 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 在哪里存储它需要为我提供服务的数据(这里:http : //www.postgresql.org/docs/8.4/static/storage-file-layout.html)
正如它所写的那样,PostgreSQL 的数据和存储似乎在我存储PGDATA文件夹的相应文件系统之上工作。在这个文件夹中,数据再次存储在一组单独的文件中(即每个数据库的文件)。
问题: 虽然我可以接受这样的“文件系统内设置”,
我想知道是否可以将 PostgreSQL 设置为直接在 POSIX 系统上使用块设备(如 /dev/sda)进行数据存储?
我认为这会提供一些优势:
如果不是 PostgreSQL,是否有已知的数据库应用程序不依赖于将其数据保存为文件文件系统,而是直接使用块设备?
我有一个包含大约 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)
并让整个事情结果在子表上创建了所有索引。
初始化测试数据:
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) 我们有一个类似的查询
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) 我正在尝试使用运行查询,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 中有一个旧的和不推荐使用的命令,它早于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 语法来做到这一点。
我有两个表叫做record和record_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 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
PostgreSQL 允许NULL在标记为 的域中使用s NOT NULL。这是为什么,文档是这么说的,
尽管存在这样的约束,但名义上属于域类型的列仍有可能读取为空。例如,如果域列位于外连接的可为空一侧,则这可能发生在外连接查询中。
这能更好地解释吗?
postgresql ×10
index ×3
copy ×1
ctas ×1
cte ×1
domain ×1
null ×1
paging ×1
performance ×1
sql-standard ×1
syntax ×1