Slony-I还有用吗,如果有,它是什么?为了澄清起见,从 9.0 Postgresql 开始支持内置流复制。
我有一个名为“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”的独占锁。
希望为一系列物质计算最合适的计量单位,其中物质以不同(但兼容)的单位体积给出。
单位转换表存储各种单位以及这些单位之间的关系:
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) 我有一个大文件转储 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。看起来很简单,但显然不是!
希望有人确切地知道如何解决它并可以帮助我!
初始化测试数据:
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) 我寻找一种简单的方法来选择除 psql 中的一列之外的所有列。
随着psql我的意思是交互式命令行。
我会很高兴有一个工具可以扩展到*引用的列名列表。然后我可以移除列以手动移除。
我的问题只是关于 psql 的交互使用。它不是那些对 sql 标准不满意并且想要执行诸如“select *-foo”之类的问题的人的问题的重复。
我们有一个类似的查询
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) 在最简单的情况下,当我们向表中插入新行(并且事务提交)时,它将对所有后续事务可见。请参阅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 使用的 …
在 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 允许NULL在标记为 的域中使用s NOT NULL。这是为什么,文档是这么说的,
尽管存在这样的约束,但名义上属于域类型的列仍有可能读取为空。例如,如果域列位于外连接的可为空一侧,则这可能发生在外连接查询中。
这能更好地解释吗?
postgresql ×10
domain ×1
foreign-key ×1
index ×1
mvcc ×1
null ×1
order-by ×1
plpgsql ×1
psql ×1
replication ×1