Postgres 10 带来了 SQL 标准GENERATED { ALWAYS | BY DEFAULT } AS IDENTITY特性的实现,松散地称为标识列。这个特性取代了 Postgres 自己的SERIAL伪类型,消除了它的问题/问题。有关更多信息,请参阅此处和此处。
GENERATED…优于的主要原因之一SERIAL是序列号生成器在后台透明处理。我们可以添加列、调整当前序列号和删除列,所有这些都无需明确引用序列。
CREATE TABLE tbl (
col BIGINT
GENERATED ALWAYS AS IDENTITY
PRIMARY KEY ,
col2 text
)
;
Run Code Online (Sandbox Code Playgroud)
和…
ALTER TABLE tbl
ALTER COLUMN col
RESTART WITH 1000
;
Run Code Online (Sandbox Code Playgroud)
和…
ALTER TABLE tbl
ALTER COLUMN col
DROP IDENTITY IF EXISTS
;
Run Code Online (Sandbox Code Playgroud)
或者…
ALTER TABLE tbl
ALTER COLUMN col
DROP COLUMN IF EXISTS …Run Code Online (Sandbox Code Playgroud) 我有一个名为“链接”的应用程序,其中 1) 用户聚集在群组中并添加其他人,2) 在上述群组中为彼此发布内容。组由links_group我的 postgresql 9.6.5 DB 中的表定义,而他们在这些中发布的回复由links_reply表定义。总体而言,DB 的性能非常好。
然而SELECT,links_reply表上的一个查询始终显示在slow_log 中。它花费的时间超过 500 毫秒,并且比我在大多数其他 postgresql 操作中遇到的速度慢约 10 倍。
我使用 Django ORM 来生成查询。这里的ORM电话:replies = Reply.objects.select_related('writer__userprofile').filter(which_group=group).order_by('-submitted_on')[:25]。本质上,这是为给定的组对象选择最新的 25 条回复。它还选择关联user和userprofile对象。
这是我的慢日志中相应 SQL 的示例:LOG: duration: 8476.309 ms 语句:
SELECT
"links_reply"."id", "links_reply"."text",
"links_reply"."which_group_id", "links_reply"."writer_id",
"links_reply"."submitted_on", "links_reply"."image",
"links_reply"."device", "links_reply"."category",
"auth_user"."id", "auth_user"."username",
"links_userprofile"."id", "links_userprofile"."user_id",
"links_userprofile"."score", "links_userprofile"."avatar"
FROM
"links_reply"
INNER JOIN "auth_user"
ON ("links_reply"."writer_id" = "auth_user"."id")
LEFT OUTER JOIN "links_userprofile"
ON ("auth_user"."id" = "links_userprofile"."user_id")
WHERE …Run Code Online (Sandbox Code Playgroud) postgresql performance upgrade postgresql-9.6 query-performance
我正在使用较旧的架构,但不明白为什么我的删除操作(清除孤立记录)在某些情况下无法按预期工作。在其他情况下,两个查询都返回相同的结果:-/
例如,我有 3 个模型:房屋、办公室和地址。 house并且office两者都有对 an 的可为空引用address.id,因此address记录可以属于它们中的任何一个,但地址本身并不指示哪个。
-- query 1
DELETE FROM address adr
WHERE
NOT EXISTS(SELECT * FROM house H WHERE H.address_id = adr.id) AND
NOT EXISTS(SELECT * FROM office O WHERE O.address_id = adr.id);
-- query 2
DELETE FROM address adr
WHERE
NOT adr.id IN (select address_id from house) AND
NOT adr.id IN (select address_id from office);
Run Code Online (Sandbox Code Playgroud)
查询 1:删除 3000 条记录(正确)
查询 2:删除 0 条记录
查询#2 的明显问题是什么?当我检查 #1 删除的记录时,它们确实不存在于 …
我在 Postgres 9.6 db 中有一个表,其结构如下:
Table "public.pricings"
Column | Type | Modifiers
---------------------------+-----------------------------+-------------------------------------------------------
id | integer | not null default nextval('pricings_id_seq'::regclass)
unconfirmed_matrix_prices | jsonb | not null default '"{}"'::jsonb
Run Code Online (Sandbox Code Playgroud)
我是使用 jsonb 的新手。
我想搜索任何空的 unconfirmed_matrix_prices(即默认值)。我看到我可以做这样的事情:
solar_dev=# select count(*) from json_object_keys('{"f1":1,"f2":2}');
count
-------
2
(1 row)
Run Code Online (Sandbox Code Playgroud)
有没有办法可以做一个 where 短语,其中 json_object_keys 等于 0?我知道一些变通的方法 - 有更好的方法吗?
我的表列定义了 intcol 整数;没有 NOT NULL 约束。在加载文件中,大多数值是整数,但有一些是空值,如复制手册所建议的那样标有 '\N' 默认值。复制命令可以将'\N' 转换为表中的空值吗?我也尝试过使用 null 'NA'。收到类似的错误信息。
ERROR: invalid input syntax for integer: "\N"
CONTEXT: COPY table_name, line 111, column position3: "\N"
Run Code Online (Sandbox Code Playgroud)
有什么技巧吗?
在此问题之后,是否更改varchar()表重写或锁定比更改CHECK约束花费更多时间的结果的长度限制(类型修饰符)?从那个问题你可以看到Brandur 的说法,
如果您想更改长度,则
ALTER TABLE需要排他锁(请参阅https://www.postgresql.org/docs/current/static/sql-altertable.html ...)。改变CHECK是即时的。在回答一个问题,质疑文CHECK (char_length(email) <= 255)VSvarchar(255)
似乎这可能起源于 Depesz 在 2010 年发表的帖子“CHAR(X) VS. VARCHAR(X) VS. VARCHAR VS. TEXT – 2010-03-03 更新”
那么,当你[使用 varchar] 使限制更大时会发生什么?
PostgreSQL 必须重写该表。这有两个非常重要的缺点: 1. 操作时需要对表进行排他锁 2. 在非平凡表的情况下,将花费相当多的时间
您可以在此处 (2017)的评论中再次看到这一点,
尽管如此,当我想将我
VARCHAR(50)的VARCHAR(250).
再次在这里(2012),
顺便说一句:如果可以避免的话,我从不使用 varchar - 特别是不使用长度修饰符。它几乎提供了类型文本无法提供的任何内容。如果我需要长度限制,我会使用一个列约束,它可以在不重写整个表的情况下进行更改。
显然还有其他人怀疑这一说法。
仅仅解决这个单一的要求可能是值得的。
我正在使用 PostgreSQL 9.6。
我有一个物化视图来支持跨两个表的全文搜索,我将其称为posts和tags。这些表格很少更新和频繁搜索。
我试图找到一个好的策略来运行REFRESH MATERIALIZED VIEW post_search.
理想的解决方案会是这样的触发器:在任何交易修饰的(或之后)的端部posts,tags和/或posts_tags(连接表),刷新物化视图正好一次。
我怎么能做到这一点?
我有一个带有 Postgresql 的服务器。我无权访问此服务器,只能访问与 psql 连接的端点。我想使用 pg_dump 将数据从这台服务器备份到另一台服务器。但是,我的第二台服务器没有 postgresql,我也没有安装它的 root 权限。有没有办法在不安装 postgresql 的情况下运行 pg_dump?
可以在我的客户端上安装 postgresql 并从中安装 pg_dump,但我担心数据库对于我的笔记本电脑来说太大了。
我有一张桌子,我想将其作为如下所述的邀请排行榜。我想创建一个查询来计算给定月份中重复行的数量并以降序排列。
通读一些问题,这个查询似乎有效:
SELECT COUNT(invite_code) AS counted
FROM invite_table
GROUP BY invite_code
ORDER BY counted DESC
LIMIT 10;
Run Code Online (Sandbox Code Playgroud)
但它不考虑月份。我正在寻找的是获得最常出现的user_code在指定月份的地方。此外,对表设计的任何批评都是受欢迎的,因为我故意设计它以便有具有重复值的重复行。我正在尝试跟踪在给定月份中使用最多邀请码的用户,我还有一些代码指示用户来自哪个频道(例如,可能在 FB 中看到广告),这是一个有效的表格设计吗?
表“public.invite_table”
专栏 | 类型 | 整理 | 可空 | 默认
-------------+--------------+-----------+- ---------+---------
用户代码 | 性格变化| | 不为空|
邀请码 | 性格变化| | |
月 | 字符变化(3) | | 不为空|
点 | 整数 | | 不为空|
索引:
"invite_table_pkey" PRIMARY KEY, btree (user_code)
外键约束:
“invite_table_user_code_fkey”外键(用户代码)参考用户表(用户代码)
我在 PostgreSQL 10 数据库product中有一个jsonb名为“元数据”的列的表。这是我第一次使用文档和 Postgres。jsonb值看起来像这样:
{
"name": "l33t 衬衫",
“价格”:“1200”,
"数量": "60",
“选项” :
{
“类型”:“收音机”,
"title": "颜色",
“选择”:[
{“价值”:“红色”,“价格”:“-100”,“数量”:“30”},
{“价值”:“蓝色”,“价格”:“+200”,“数量”:“10”},
{“价值”:“绿色”,“价格”:“+300”,“数量”:“20”}
]
}
}
两个问题:
1.如何选择“opts”数组中的特定元素?
select metadata->'options'->'opts'->(element here) from product
where metadata->'options'->'opts' @> '[{"value" : "blue"}]'
Run Code Online (Sandbox Code Playgroud)
2 、当售出一件或多件时,如何更新“数量”(减去当前的“数量”)?
对指南/注释的进一步链接表示赞赏。
postgresql ×10
json ×2
aggregate ×1
date ×1
fast-refresh ×1
identity ×1
index ×1
locking ×1
performance ×1
psql ×1
update ×1
upgrade ×1