标签: postgresql

如何预测 VACUUM FULL 会回收多少空间?

有没有办法提前确定VACUUM FULL特定表上的多少磁盘空间将返回给操作系统?因此,您可以决定这样做是否值得付出代价。

如果有一个简单的查询来为数据库/服务器中的每个表执行此操作(而不是单独执行每个表),则奖励。

postgresql vacuum postgresql-12

5
推荐指数
1
解决办法
220
查看次数

PostgreSQL - CAST vs :: LATERAL 表函数上的运算符

虽然我可以

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)

我怀疑是否存在句法原因,例如使用额外的括号 - 这在这里是不正确的。

此时是否只需要显式函数调用作为低级实现的一部分?或者它是否遵循任何语言规则?

postgresql type-conversion cast operator

5
推荐指数
2
解决办法
1628
查看次数

为什么 10,000 个 ID 的列表比使用等效的 SQL 来选择它们的性能更好?

我有一个带有遗留查询的 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

5
推荐指数
1
解决办法
113
查看次数

Postgres 不返回有关 array_agg 查询的数据,如下所示

当特定图书馆中没有书籍数据时,就会出现问题。考虑以下工作场景。

桌子 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)

postgresql join array coalesce sqlalchemy

5
推荐指数
2
解决办法
312
查看次数

在 postgres 中,在多个表和一对多关系上使用 json 字段有什么真正的缺点吗?

在我们当前的应用程序中,我们基本上将为每个字段提供称为“翻译”的东西。所以一个表最初是这样的:

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 database-design

5
推荐指数
1
解决办法
498
查看次数

新安装 PostgreSQL 后无法使用 PgAdmin4 进行还原 - 找不到 pg_restore.exe 文件

我是 PostgreSQL 的新手。我安装了软件。几乎一切正常。然后我尝试按照 dvdrental 的教程进行操作。从命令行使用的所有说明都有效。然后是使用 pgAmdin 4 创建数据库的说明,它也有效。下一条指令是进行恢复。这失败了。错误消息是找不到“C:\Program Files\PostgreSQL\13\pgAdmin 4\runtime\pg_restore.exe”文件。请更正首选项对话框中的二进制路径。该消息是正确的。pg_restore.exe 不在运行时文件夹中,运行时文件夹不存在。有一个 bin 文件夹,pg_restore.exe 就是那个方向。我尝试了各种方法,例如更改“EDB 高级服务器二进制路径”,我还创建了文件夹运行时并将 bin 文件夹中的所有内容复制到运行时,但它仍然无法正常工作。这看起来像一个安装问题。同样的信息似乎已经出现多年,但这些解决方案都没有对我有用。我将不胜感激任何帮助。

postgresql pgadmin-4

5
推荐指数
2
解决办法
8379
查看次数

PostgreSQL 更新加入与 SQL Server 更新加入

我最近开始将个人项目从 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)

postgresql join sql-server update

5
推荐指数
1
解决办法
438
查看次数

当限制为一对多时,在一对多对多桥接关系中强制执行唯一性

我们定义了一系列配置,其中,在 RESTful API 的驱动下,最终用户可以构建新的修订版本。配置的某些组件可以有多个值;修订涉及具有一对多关系的多个表。

因为配置被运往别处,修订被标记为已部署,并且变得不可变。如果用户想对配置进行更改,他们必须创建一个新修订(可以从现有修订中克隆)。每个配置的一个 修订版可以标记为“当前”;这允许用户随意在过去的修订之间切换,或者通过不选择任何修订来完全禁用配置。当前版本已部署,当将不同版本标记为“当前”时,您将替换已部署的配置。

我们已经准备好了一切来强制部署修订的不变性;当您第一次使用修订作为当前修订时,该deployed列会自动转换为TRUE,并且所有进一步的INSERT,UPDATEDELETE与修订相关表中部署的修订 ID 匹配的行的操作都将被阻止。

但是,用于公共名称表中的name列的任何值在所有当前配置的所有“当前”修订中都必须是唯一的。我正在尝试找出执行此操作的最佳策略。

如果这是从配置到公共名称的简单一对多关系,则可以通过对name列使用唯一约束来解决。相反,这是一种一对多模式,revision充当桥接表,并将current_revision_id一对多对多关系“折叠”为从配置到虚拟的一对多关系公共名称。

这是一组简化的表格,用于说明我们的情况:

-- 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 …
Run Code Online (Sandbox Code Playgroud)

postgresql trigger physical-design unique-constraint

5
推荐指数
1
解决办法
155
查看次数

如何为带有索引的 Postgres 表创建仅插入用户?

这是我建议的架构:

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)

还有什么我没有想到的吗?

schema postgresql permissions

5
推荐指数
1
解决办法
326
查看次数

postgresql:在某些备用服务器上重放流式 WAL 文件很慢

环境: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 replication

5
推荐指数
1
解决办法
72
查看次数