我正在对我公司的一些 SQL 进行一些性能基准测试,将 PG10 与 PG12 进行比较。我们在代码中使用了很多CTE,而 PG12 并没有对 CTE 进行原生优化,因此 PG10 和 PG12 之间的性能是相同的。
我的下一个实验是将NOT MATERIALIZED指令添加到 CTE,结果令人震惊:它大大缩短了查询时间(在某些情况下将它们减半)。
我在这里读到这MATERIALIZED是 PG12 之前的默认功能。该功能会将 CTE 的所有内容写入一个临时位置。
所以我的问题主要是NOT MATERIALIZED:
NOT MATERIALIZED功能对幕后的数据MATERIALIZED有何作用? NOT MATERIALIZED在重构我们的代码库之前,我应该注意哪些副作用?我正在尝试优化一个查询,该查询在 Postgres 12.7 上从未完成。需要几个小时甚至几天的时间才能使 CPU 达到 100%,并且永远不会返回:
SELECT "id", "counter", "item_id", "item_name", "type", "updated_time"
FROM "changes"
WHERE (type = 1 OR type = 3) AND user_id = 'kJ6GYJNPM4wdDY5dUV1b8PqDRJj6RRgW'
OR type = 2 AND item_id IN (SELECT item_id FROM user_items WHERE user_id = 'kJ6GYJNPM4wdDY5dUV1b8PqDRJj6RRgW')
ORDER BY "counter" ASC LIMIT 100;
Run Code Online (Sandbox Code Playgroud)
我随机尝试使用 UNION 重写它,我相信它是等效的。基本上查询中有两部分,一部分用于 type = 1 或 3,另一部分用于 type = 2。
(
SELECT "id", "counter", "item_id", "item_name", "type", "updated_time"
FROM "changes"
WHERE (type = 1 OR type = 3) AND user_id …Run Code Online (Sandbox Code Playgroud) postgresql union postgresql-12 postgresql-performance ugly-or
我想知道是否可以(和/或可取)创建对值进行约束的自定义类型。假设我有一个高度/宽度/长度的自定义类型:
CREATE TYPE dimensions AS (w float, h float, l float);
我想确保我的宽度都不大于 10(例如)。
这样的事情可能吗,或者我会更好地在使用这种类型的每个表上创建检查约束吗?我希望能够在单个位置(即类型本身)添加/编辑约束。
谢谢!
我确信以前有人问过这个问题,但由于这个问题可以用多种不同的方式表达,因此很难找到正确的答案。
我有一个订单表,其中订单号有一个varchar字段,其格式为 4 位年份、破折号 (-) 和渐进数值。例如,它可能包含以下值:
SELECT number FROM orders ORDER BY number LIMIT 10;
number
----------
1999-13
2019-11
2020-1
2020-10
2020-100
2020-12
2020-2
2020-21
2020-3
2021-1
Run Code Online (Sandbox Code Playgroud)
我需要按年份对该字段进行排序,然后按渐进数字进行排序,预期结果如下:
number
----------
1999-13
2019-11
2020-1
2020-2
2020-3
2020-10
2020-12
2020-21
2020-100
2021-1
Run Code Online (Sandbox Code Playgroud)
我的问题是:
我想至少保留第一个答案尽可能与数据库无关(这就是为什么我没有包含数据库特定标签的原因),但是如果不同的 DBMS/版本可能有不同的最佳答案,那么我们假设 PostgreSQL 12。
我有一个包含超过 10.000.000 条记录的表,并且我正在创建一个返回大约 4436 条记录的查询。
碰巧它给我的印象是获取最后一条记录的查询成本非常高。
Index Scan using idx_name on task (cost=0.28..142102.57 rows=3470 width=34) (actual time=14.690..22.894 rows=4436 loops=1)
" Index Cond: ((situation = ANY ('{0,1,2,3,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20}'::integer[])) AND (deadline < CURRENT_TIMESTAMP))"
Planning Time: 1.335 ms
JIT:
Functions: 5
Options: Inlining false, Optimization false, Expressions true, Deforming true
Timing: Generation 1.654 ms, Inlining 0.000 ms, Optimization 1.214 ms, Emission 13.163 ms, Total 16.030 ms
Execution Time: 24.758 ms
Run Code Online (Sandbox Code Playgroud)
这个成本水平是否可以接受,或者这个指标是否需要改进?
指数:
CREATE INDEX idx_name ON task (situation, deadline, approved)
WHERE
deadline IS NOT …Run Code Online (Sandbox Code Playgroud) 如何通过查看 lsn 来监控 Postgresql 12 中的逻辑复制?
我所做的:检查发布者和订阅者上的一些列。
出版方:
select * from pg_stat_replication; -- 查看 REPLAY_LSN
select * from pg_replication_slots; -- 参见 CONFIRMED_FLUSH_LSN
订阅方:
select * from pg_catalog.pg_stat_subscription; -- 查看 RECEIVED_LSN 和 LATEST_END_LSN
我确保这些列中的所有值都相同。
我对么 ?或者是否有其他方法可以通过检查某些参数来查看复制工作?
postgresql ×6
datatypes ×1
natural-sort ×1
optimization ×1
order-by ×1
replication ×1
ugly-or ×1
union ×1