标签: postgresql

在 DigitalOcean 上启动托管 Postgres 集群时,为什么要下载 CA 证书?

我第一次尝试由 DigitalOcean.com 作为托管服务提供的 Postgres 集群。

\n

作为配置新集群的一部分,他们的 Web 界面为我提供了用户名、密码、端口号等。该网页上有一个小链接,上面写着Download the CA certificate。我认为CA意味着证书颁发机构

\n

\xe2\x9e\xa5 为什么我会使用或不使用该链接来下载证书?

\n

当我单击该链接时,我的计算机上最终会出现一个名为ca-certificate.crt. 我将如何使用这个文件?

\n

postgresql connections certificate

3
推荐指数
1
解决办法
963
查看次数

如何在 PostgreSQL 中提取匿名行类型的字段

在 PostgreSQL 中我可以创建匿名行或复合类型

postgres=# SELECT ROW(1,'Hello',false) as r;
      r
-------------
 (1,Hello,f)
(1 row)
Run Code Online (Sandbox Code Playgroud)

但我怎样才能把这些田地重新拿出来呢?没有以下工作

postgres=# SELECT (r).* from (SELECT ROW(1,'Hello',false) as r) as T;
ERROR:  record type has not been registered

postgres=# SELECT (r).column0 from (SELECT ROW(1,'Hello',false) as r) as T;
ERROR:  record type has not been registered
Run Code Online (Sandbox Code Playgroud)

postgresql composite-types

3
推荐指数
1
解决办法
3177
查看次数

Postgres 11 - 对具有 NULL 值的日期列进行范围分区

我们有一个表结构,父记录和子记录位于同一个表中。它们通过列 ( parentId ) 引用,该列引用父记录(顶部父记录上为 null)。此外,我们有一个请求的日期列,我们通过该列进行所有查询,但唯一具有此值的记录是父记录。

由于我们所有的查询最初都是根据父结果进行过滤并使用此日期,因此我们希望在此日期范围内对表进行分区,但我们知道这是不可能的,因为子记录的记录中存在空值。

除了在数据库中的每个子记录上创建一个“虚拟”值(一些永远不会在我们的过滤器中捕获的任意日期)之外,我们还有什么其他选择?是否不可能以某种方式为我们从未查询过的所有空值创建一个单独的分区?

postgresql null partitioning

3
推荐指数
1
解决办法
3382
查看次数

与直接写入“真实数据库”相比,是什么使得写入“WAL”要快得多?

如果我理解正确的话,PostgreSQL 是这样工作的:

  1. 我对 PG 数据库中的表进行 INSERT、DELETE 或 UPDATE 查询。
  2. PG 立即以原始(内部)日志的形式(可能是二进制格式)将此查询及其参数写入 HDD/SSD。
  3. 假设该表足够小,可以存储在 RAM 中,PG 现在会插入/删除/更新此“RAM 表”以反映更改,但实际上并不更改数据库文件。
  4. 在稍后的某个时间点,也许是几秒钟,也许是几分钟,甚至可能是几小时或几天后,当它“有时间”时,PG 使用此“WAL”日志文件中的信息更新数据库文件,并删除相关行( s)/WAL 日志文件中的条目。

对于这个看似奇怪的仪式,我得到的解释是,对于每个查询,写入 WAL 比直接写入数据库文件要快得多。

但这是为什么呢?我认为 PG 的 WAL 日志文件比仅仅“在文本文件末尾添加行”更复杂,因为这可能会导致两个查询同时写入它,从而丢失或损坏数据。所以它必须比这更复杂。这意味着更多的开销。此时我想知道这样做有什么真正的性能优势,因为归根结底,这两者都涉及写入速度较慢的 HDD/SSD 磁盘。

不过,我并不怀疑这一点。我只是想知道为什么它这么快。

在我看来,写入数据库文件的问题与写入 WAL 的问题相同。在这两种情况下,您都需要确保它有序且正确地完成。我唯一的猜测是,也许各种约束检查之类的查找成本很高。

显然,“WAL”的概念是 PostgreSQL 所独有的,但至少对已执行的查询保留某种“选项卡”,以解决断电和软件崩溃问题,这听起来只是常识。每次只是盲目地写入数据库文件,甚至不保留任​​何类型的日志,这听起来像是一场灾难,我无法想象任何数据库曾经这样做过。想象一下,如果有人在断电时进行了 100 万美元的交易,然后他们的账户损失了 100 万美元,但另一个人却没有收到任何钱!即使是 20 世纪 40 年代的数据库软件也可能不是这样工作的……

postgresql write-ahead-logging

3
推荐指数
1
解决办法
1293
查看次数

是否可以使用 PostgreSQL 更改现有数据库的排序规则?

例如从 更改Cutf8?

我尝试过这个,但似乎不允许。

postgres=# ALTER DATABASE mydb SET "Collate" To 'en_US.UTF-8';
ERROR:  unrecognized configuration parameter "Collate"
Run Code Online (Sandbox Code Playgroud)

postgresql

3
推荐指数
1
解决办法
1万
查看次数

运行 pg_stat_reset 会导致性能问题吗?

我正在对我们的数据库进行一些索引分析,看看是否有可以删除的索引。为此,我想运行select pg_stat_reset();将所有统计计数器重置为零,然后等待一周,看看哪些索引尚未使用。

运行pg_stat_reset()是否也会重置行计数统计信息?这会影响查询规划器吗?

Analyze public.#table#重置统计数据后是否建议在所有表上重新运行?

谢谢!

postgresql

3
推荐指数
1
解决办法
6097
查看次数

PLPGSQL 捕获循环中的任何异常

我有以下地理编码功能,无需该EXCEPTION WHEN OTHERS THEN部分即可正常工作。但是,我希望循环继续,以防出现异常。所以我试图通过使用来做到这一点EXCEPTION WHEN OTHERS THEN

CREATE OR REPLACE FUNCTION mygetcounty2() RETURNS void LANGUAGE PLPGSQL AS $$
DECLARE idVariable uuid;
begin
FOR i IN 1..100 LOOP

SELECT id into idVariable FROM address_table WHERE county IS NULL AND parse_address_error = false LIMIT 1;

UPDATE address_table set county =
(select namelsad from tiger_data.county_all where ST_Contains( the_geom, ST_GeomFromText( (SELECT ST_AsText( ST_SnapToGrid(g.geomout, 0.00001) ) As wktlonlat FROM geocode(address, 1 ) AS g), 4269 ) ))
where id = idVariable;
EXCEPTION …
Run Code Online (Sandbox Code Playgroud)

postgresql plpgsql

3
推荐指数
1
解决办法
3723
查看次数

我需要验证约束吗?

我创建了一个外键约束,并且知道不存在违规情况,因此我将其标记为NOT VALID跳过检查。

\n

文档中:

\n
\n

但数据库不会假设该约束适用于表中的所有行,直到使用该VALIDATE CONSTRAINT选项对其进行验证为止。

\n
\n

它没有提到后果 \xe2\x80\x93甚至在注释\xe2\x80\x93 中也没有提及,如果有的话。

\n

如果约束没有标记为永远有效,这有关系吗?

\n

postgresql constraint

3
推荐指数
1
解决办法
5399
查看次数

SELECT sql_function(...) 与 SELECT * FROM sql_function(...)

我第一次阅读 PostgreSQL 文档,当面对 SQL 函数时,我认为我已经理解了所有基础知识,但仍然看不出SELECT sql_function(...)SELECT * FROM sql_function(...)以及何时使用其中一个的区别。

postgresql functions

3
推荐指数
1
解决办法
4193
查看次数

text_pattern_ops 和 COLLATE "C" 之间有区别吗?

name例如,如果我有一个带有排序规则的文本列tr-TR,并且我运行一个查询

SELECT * FROM t WHERE name LIKE 'a%'
Run Code Online (Sandbox Code Playgroud)

然后这将进行 seq 扫描。

如果我现在创建一个索引

CREATE INDEX ON t(name text_pattern_ops)
Run Code Online (Sandbox Code Playgroud)

上面的查询将变成位图扫描。但还有另一种技术可以达到相同的结果:

CREATE INDEX ON t(name COLLATE "C")
Run Code Online (Sandbox Code Playgroud)

这些方法完全等同还是存在差异?

postgresql index collation

3
推荐指数
1
解决办法
3527
查看次数