有没有办法提前确定VACUUM FULL特定表上的多少磁盘空间将返回给操作系统?因此,您可以决定这样做是否值得付出代价。
如果有一个简单的查询来为数据库/服务器中的每个表执行此操作(而不是单独执行每个表),则奖励。
虽然我可以
SELECT elem[1], elem[2]
FROM ( VALUES ('1,2'::TEXT) ) AS q(arr),
LATERAL CAST(String_To_Array(q.arr, ',') AS INT[]) AS elem
;
Run Code Online (Sandbox Code Playgroud)
使用显式调用CAST,我不能
SELECT elem[1], elem[2]
FROM ( VALUES ('1,2'::TEXT) ) AS q(arr),
LATERAL String_To_Array(q.arr, ',')::INT[] AS elem
;
Run Code Online (Sandbox Code Playgroud)
使用隐式调用::运算符:
错误:“::”处或附近的语法错误
另一个CAST需要显式的位置:
CREATE INDEX ON ... ( CAST(<straw> AS <gold>) );
Run Code Online (Sandbox Code Playgroud)
我怀疑是否存在句法原因,例如使用额外的括号 - 这在这里是不正确的。
此时是否只需要显式函数调用作为低级实现的一部分?或者它是否遵循任何语言规则?
我有一个带有遗留查询的 Rails 应用程序,我想对其进行翻新。当前实现执行两个 SQL 查询:一个获取大量 ID,第二个查询使用这些 ID 并应用一些额外的连接和过滤器来获得所需的结果。
我试图用避免往返的单个查询替换它,但这样做会导致我的本地测试环境(这是完整生产数据集的副本)的性能大幅下降。新查询中似乎没有使用索引,导致全表扫描。我曾希望单个查询能够保持与原始代码相同的性能,理想情况下,由于不需要发送所有 ID,因此可以对其进行改进。
这是我实际问题的最小化版本。稍大一点的版本在讨论为什么10000个ID的列表中一个复杂的查询有更好的表现与多个热膨胀系数相比,相当于SQL选择它们?.
有一个查询需要大约 6.5 秒来计算 10000 多个 ID 的列表。您可以visible_projects在下面的“建议查询”部分中将其视为 CTE 。然后将这些 ID 输入到此查询中:
EXPLAIN (ANALYZE, BUFFERS)
WITH visible_projects AS NOT MATERIALIZED (
SELECT
id
FROM
"projects"
WHERE
"projects"."id" IN (
-- 10000+ IDs removed
)),
visible_tasks AS MATERIALIZED (
SELECT
tasks.id
FROM
tasks
WHERE
tasks.project_id IN (
SELECT
id
FROM
visible_projects))
SELECT
COUNT(1)
FROM
visible_tasks;
Run Code Online (Sandbox Code Playgroud)
查询计划(depesz)
Aggregate (cost=1309912.31..1309912.32 rows=1 width=8) (actual time=148.661..153.739 …Run Code Online (Sandbox Code Playgroud) postgresql performance query-performance postgresql-performance
当特定图书馆中没有书籍数据时,就会出现问题。考虑以下工作场景。
桌子 library
--------------------------------
| id | name | owner |
--------------------------------
| 1 | ABC | A |
| 2 | DEF | D |
| 3 | GHI | G |
--------------------------------
Run Code Online (Sandbox Code Playgroud)
桌子 books
--------------------------------
| id | title | library |
--------------------------------
| a | xxx | 1 |
| b | yyy | 1 |
| c | zzz | 2 |
--------------------------------
Run Code Online (Sandbox Code Playgroud)
现在,当我进行如下查询时:
SELECT library.name, array_agg(b.title) AS book_list FROM library,
(SELECT title FROM books WHERE …Run Code Online (Sandbox Code Playgroud) 在我们当前的应用程序中,我们基本上将为每个字段提供称为“翻译”的东西。所以一个表最初是这样的:
CREATE TABLE organisation (
id SERIAL PRIMARY KEY,
name TEXT NOT NULL DEFAULT '',
)
Run Code Online (Sandbox Code Playgroud)
但是,该名称现在将取决于语言。
基本的解决方案是不再将名称字段存储在组织表中,而是存储在“organisation_language”表中:
CREATE TABLE organisation (
id SERIAL PRIMARY,
);
CREATE TABLE organisation_language
(
id SERIAL PRIMARY KEY,
organisation INTEGER NOT NULL,
field_name TEXT NOT NULL,
field_language TEXT NOT NULL,
field_translation TEXT NOT NULL DEFAULT '',
FOREIGN KEY (organisation)
REFERENCES public.organisation (id) MATCH SIMPLE
ON UPDATE CASCADE
ON DELETE CASCADE
NOT VALID
);
Run Code Online (Sandbox Code Playgroud)
(是的,我故意忽略了我可以为语言键添加查找表en-US并参考它)。
但是,现在我不能再“保证”name定义每个字段(如)。当然,代码可以确保它确实如此,但那是另一层。它还增加了相当多的复杂性,因为不再容易看到哪些字段甚至属于数据模型。或者为某个组织提供什么翻译。
如果我查看 JSON,我实际上会“喜欢”我的后端在请求“来自组织 1 …
我是 PostgreSQL 的新手。我安装了软件。几乎一切正常。然后我尝试按照 dvdrental 的教程进行操作。从命令行使用的所有说明都有效。然后是使用 pgAmdin 4 创建数据库的说明,它也有效。下一条指令是进行恢复。这失败了。错误消息是找不到“C:\Program Files\PostgreSQL\13\pgAdmin 4\runtime\pg_restore.exe”文件。请更正首选项对话框中的二进制路径。该消息是正确的。pg_restore.exe 不在运行时文件夹中,运行时文件夹不存在。有一个 bin 文件夹,pg_restore.exe 就是那个方向。我尝试了各种方法,例如更改“EDB 高级服务器二进制路径”,我还创建了文件夹运行时并将 bin 文件夹中的所有内容复制到运行时,但它仍然无法正常工作。这看起来像一个安装问题。同样的信息似乎已经出现多年,但这些解决方案都没有对我有用。我将不胜感激任何帮助。
我最近开始将个人项目从 Microsoft SQL Server 转换为 PostgreSQL,我对UPDATE JOIN在两个表之间执行时遇到的糟糕性能感到惊讶。
假设它们看起来像:
CREATE TABLE foo (
id INTEGER NOT NULL PRIMARY KEY,
bar INTEGER NULL
);
CREATE TABLE foo2 (
id INTEGER NOT NULL PRIMARY KEY,
bar INTEGER NULL
);
Run Code Online (Sandbox Code Playgroud)
在 T-SQL 中,我会使用这样的连接来进行更新:
UPDATE foo
SET bar = t2.bar
FROM foo t1
JOIN foo2 t2
ON t1.id = t2.id;
Run Code Online (Sandbox Code Playgroud)
但是在 Postgres 中运行,查询速度非常慢。
如果我将其更改为:
UPDATE foo
SET bar = t2.bar
FROM foo2 t2
WHERE foo.id = t2.id;
Run Code Online (Sandbox Code Playgroud)
这不是问题。
我知道语法是不同的,但我希望查询优化器能在同一个球场上解决一些问题。相反,事情变得疯狂。除了语法差异之外,我看不到的两个查询之间是否存在细微差别?
Update on foo …Run Code Online (Sandbox Code Playgroud) 我们定义了一系列配置,其中,在 RESTful API 的驱动下,最终用户可以构建新的修订版本。配置的某些组件可以有多个值;修订涉及具有一对多关系的多个表。
因为配置被运往别处,修订被标记为已部署,并且变得不可变。如果用户想对配置进行更改,他们必须创建一个新修订(可以从现有修订中克隆)。每个配置的一个 修订版可以标记为“当前”;这允许用户随意在过去的修订之间切换,或者通过不选择任何修订来完全禁用配置。当前版本已部署,当将不同版本标记为“当前”时,您将替换已部署的配置。
我们已经准备好了一切来强制部署修订的不变性;当您第一次使用修订作为当前修订时,该deployed列会自动转换为TRUE,并且所有进一步的INSERT,UPDATE和DELETE与修订相关表中部署的修订 ID 匹配的行的操作都将被阻止。
但是,用于公共名称表中的name列的任何值在所有当前配置的所有“当前”修订中都必须是唯一的。我正在尝试找出执行此操作的最佳策略。
如果这是从配置到公共名称的简单一对多关系,则可以通过对name列使用唯一约束来解决。相反,这是一种一对多模式,revision充当桥接表,并将current_revision_id一对多对多关系“折叠”为从配置到虚拟的一对多关系公共名称。
这是一组简化的表格,用于说明我们的情况:
Run Code Online (Sandbox Code Playgroud)-- Configurations CREATE TABLE config ( id INT PRIMARY KEY, name VARCHAR(100), current_revision_id INT ); -- Have multiple revisions CREATE TABLE revision ( id INT PRIMARY KEY, config_id INT NOT NULL REFERENCES config(id), created_at TIMESTAMP WITH TIME ZONE …
这是我建议的架构:
CREATE TABLE Surveys (
id serial primary key,
user_email citext,
survey_data jsonb,
created_at timestamp default current_timestamp
);
CREATE INDEX surveys_email_idx ON Surveys(user_email);
CREATE USER SurveyWriter;
Run Code Online (Sandbox Code Playgroud)
我知道我需要:
GRANT INSERT ON dbname.Surveys TO SurveyWriter;
Run Code Online (Sandbox Code Playgroud)
但我还需要:
GRANT INSERT, UPDATE ON dbname.surveys_email_idx to SurveyWriter;
Run Code Online (Sandbox Code Playgroud)
还有什么我没有想到的吗?
环境:Postgresql 9.6.21。由patoni管理的多台备用服务器
+ Cluster: db11 (12345678901234567) ------+---------+-----+-----------+
| Member | Host | Role | State | TL | Lag in MB |
+---------------+--------------+--------------+---------+-----+-----------+
| db11-01 | db11-01 | Leader | running | 113 | |
| db11-02 | db11-02 | Sync Standby | running | 113 | 0 |
| db11-03 | db11-03 | Sync Standby | running | 113 | 0 |
| db11-04 | db11-04 | Sync Standby | running | 113 | 8 |
+---------------+--------------+--------------+---------+-----+-----------+
Run Code Online (Sandbox Code Playgroud)
一些 pg_settings …
postgresql ×10
join ×2
array ×1
cast ×1
coalesce ×1
operator ×1
performance ×1
permissions ×1
pgadmin-4 ×1
replication ×1
schema ×1
sql-server ×1
sqlalchemy ×1
trigger ×1
update ×1
vacuum ×1