我第一次尝试由 DigitalOcean.com 作为托管服务提供的 Postgres 集群。
\n作为配置新集群的一部分,他们的 Web 界面为我提供了用户名、密码、端口号等。该网页上有一个小链接,上面写着Download the CA certificate。我认为CA意味着证书颁发机构。
\xe2\x9e\xa5 为什么我会使用或不使用该链接来下载证书?
\n当我单击该链接时,我的计算机上最终会出现一个名为ca-certificate.crt. 我将如何使用这个文件?
在 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) 我们有一个表结构,父记录和子记录位于同一个表中。它们通过列 ( parentId ) 引用,该列引用父记录(顶部父记录上为 null)。此外,我们有一个请求的日期列,我们通过该列进行所有查询,但唯一具有此值的记录是父记录。
由于我们所有的查询最初都是根据父结果进行过滤并使用此日期,因此我们希望在此日期范围内对表进行分区,但我们知道这是不可能的,因为子记录的记录中存在空值。
除了在数据库中的每个子记录上创建一个“虚拟”值(一些永远不会在我们的过滤器中捕获的任意日期)之外,我们还有什么其他选择?是否不可能以某种方式为我们从未查询过的所有空值创建一个单独的分区?
如果我理解正确的话,PostgreSQL 是这样工作的:
对于这个看似奇怪的仪式,我得到的解释是,对于每个查询,写入 WAL 比直接写入数据库文件要快得多。
但这是为什么呢?我认为 PG 的 WAL 日志文件比仅仅“在文本文件末尾添加行”更复杂,因为这可能会导致两个查询同时写入它,从而丢失或损坏数据。所以它必须比这更复杂。这意味着更多的开销。此时我想知道这样做有什么真正的性能优势,因为归根结底,这两者都涉及写入速度较慢的 HDD/SSD 磁盘。
不过,我并不怀疑这一点。我只是想知道为什么它这么快。
在我看来,写入数据库文件的问题与写入 WAL 的问题相同。在这两种情况下,您都需要确保它有序且正确地完成。我唯一的猜测是,也许各种约束检查之类的查找成本很高。
显然,“WAL”的概念是 PostgreSQL 所独有的,但至少对已执行的查询保留某种“选项卡”,以解决断电和软件崩溃问题,这听起来只是常识。每次只是盲目地写入数据库文件,甚至不保留任何类型的日志,这听起来像是一场灾难,我无法想象任何数据库曾经这样做过。想象一下,如果有人在断电时进行了 100 万美元的交易,然后他们的账户损失了 100 万美元,但另一个人却没有收到任何钱!即使是 20 世纪 40 年代的数据库软件也可能不是这样工作的……
例如从 更改C为utf8?
我尝试过这个,但似乎不允许。
postgres=# ALTER DATABASE mydb SET "Collate" To 'en_US.UTF-8';
ERROR: unrecognized configuration parameter "Collate"
Run Code Online (Sandbox Code Playgroud) 我正在对我们的数据库进行一些索引分析,看看是否有可以删除的索引。为此,我想运行select pg_stat_reset();将所有统计计数器重置为零,然后等待一周,看看哪些索引尚未使用。
运行pg_stat_reset()是否也会重置行计数统计信息?这会影响查询规划器吗?
Analyze public.#table#重置统计数据后是否建议在所有表上重新运行?
谢谢!
我有以下地理编码功能,无需该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 文档,当面对 SQL 函数时,我认为我已经理解了所有基础知识,但仍然看不出SELECT sql_function(...)和SELECT * FROM sql_function(...)以及何时使用其中一个的区别。
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 ×10
certificate ×1
collation ×1
connections ×1
constraint ×1
functions ×1
index ×1
null ×1
partitioning ×1
plpgsql ×1