我似乎找不到描述 PostgreSQL 模式名称有效格式的文档。我知道架构名称不能:
pg_还有什么?我应该在哪里看?
我有一个 heroku postgres 数据库,想将它迁移到 Amazon RDS 以节省成本。有什么方法可以最大限度地减少停机时间?通常这涉及实时复制数据库,然后将复制的 DB 提升为主 DB。
我知道我可以使用跟随者数据库在 heroku 中迁移数据库,我可以使用只读副本数据库在 Amazon RDS 中迁移数据库。是否有类似的方法来创建位于我自己的 Amazon RDS 中的 heroku DB 的数据库复制?
我在PostgreSQL 教程上读到了这篇文章:
如果您想从存储过程返回值,可以使用输出参数。输出参数的最终值将返回给调用者。
然后我发现DZone的函数和存储过程之间存在差异:
存储过程不返回值,但存储函数返回单个值
谁能帮我解决这个问题。
如果我们可以从存储过程中返回任何内容,也请让我知道如何从SELECT主体内的语句中执行此操作。
如果我有错的地方请告知。
我的数据库中已经有几百万行了。我在设计模式时不知道 PostgreSQL UUID 数据类型。
其中一个表有 1600 万行(每个分片大约有 350 万到 400 万条记录),每天增长大约 50 万条记录。如果需要,我仍然可以将生产系统关闭几个小时。一两周内我不会有这种奢侈。
我的问题是,这样做是否值得?我想知道 JOIN 性能、磁盘空间使用(完整的 gzip 转储是 1.25 GiB),以及这种性质的事情。
表架构是:
# \d twitter_interactions
Table "public.twitter_interactions"
Column | Type | Modifiers
-------------------------+-----------------------------+-----------
interaction_id | character(36) | not null
status_text | character varying(1024) | not null
screen_name | character varying(40) | not null
twitter_user_id | bigint |
replying_to_screen_name | character varying(40) |
source | character varying(240) | not null
tweet_id | bigint | not null
created_at | timestamp without time zone …Run Code Online (Sandbox Code Playgroud) 我不清楚 IMMUTABLE、VOLATILE 和 STABLE 函数定义中的真正含义。
我阅读了文档,特别是每个文档的定义。
IMMUTABLE 表示函数不能修改数据库并且 在给定相同的参数值时总是返回相同的结果;也就是说,它不进行数据库查找或以其他方式使用不直接出现在其参数列表中的信息。如果给出了这个选项,任何带有全常量参数的函数调用都可以立即替换为函数值。
STABLE 表示该函数不能修改数据库,并且在单个表扫描中,对于相同的参数值,它将始终返回相同的结果,但其结果可能会在 SQL 语句之间发生变化。对于结果取决于数据库查找、参数变量(例如当前时区)等的函数,这是合适的选择。(对于希望查询由当前命令修改的行的 AFTER 触发器是不合适的。)另请注意, current_timestamp 系列函数被认为是稳定的,因为它们的值在事务中不会改变。
VOLATILE 表示即使在单个表扫描中函数值也可以更改,因此无法进行优化。从这个意义上说,相对较少的数据库函数是易变的;一些例子是 random()、currval()、timeofday()。但请注意,任何具有副作用的函数都必须归类为 volatile,即使其结果是可预测的,以防止调用被优化掉;一个例子是 setval()。
我的困惑来自与不可改变的条件,稳定的功能总是或始终返回相同的结果给出了相同的论点。
IMMUTABLE 定义声明该函数不进行数据库查找或以其他方式使用未直接出现在其参数列表中的信息。所以,对我来说,这意味着这些函数用于操作客户端提供的数据,并且不应该有 SELECT 语句......尽管这对我来说听起来有点奇怪。
对于 STABLE,定义类似,因为它说它应该始终如一地返回相同的结果。所以,对我来说,这意味着每次使用相同的参数调用函数时,它都应该返回相同的结果(每次都返回相同的行)。
所以,对我来说......这意味着任何对一个或多个可以更新的表执行 SELECT 的函数应该只是易失性的。
但是,再一次……这对我来说听起来不对。
回到我的用例,我正在编写在不断添加的表上执行带有多个 JOIN 的 SELECT 语句的函数,因此函数调用预计每次调用时都会返回不同的结果,即使使用相同的参数.
那么,这是否意味着我的函数应该是 VOLATILE?即使文档表明相对较少的数据库函数在这个意义上是易变的?
谢谢!
增加 default_statistics_target 值可以使您的数据库更快,特别是在分析之后....
阅读这篇文章我看到https://discuss.pivotal.io/hc/en-us/articles/201581033-default-statistics-target-Explained
(...) 简而言之,这个参数控制着统计数据的收集方式,值 1 是估计最少/准确的统计数据,值 1000 是最准确的统计数据,显然会消耗时间/资源(CPU、内存等)/空间。通常默认值足以获得准确的计划,但如果您有复杂的数据分布/或查询中经常引用一列,则设置更高的值可能有助于获得更好的表统计信息,因此优化器执行的更好计划。
这是一个很好的解释,但例如,如果我设置 default_statistics_target= 1000 1000 真正意味着什么?正在生成 1000 KB 的统计数据?或者它可能是分析的表的 1000 行?也许是 1000 列?或者每次分析可能需要 1000 秒...
所以我的问题是这个数字是如何真正影响分析或查询规划器的?很明显,我知道 default_statistics_target = 1000 将获得比 100 更多的时间,用于运行分析,并且 1000 将生成更好的统计数据......
Postgres 系统列记录在第 5 章。数据定义 > 5.4。系统列。
该页面提到oid值“是 32 位数量”。该页面对交易标识符也有同样的说法。所以我假设这意味着oid, tableoid, xmin, cmin, xmax, 和cmax都是 32 位整数。
但这离开了ctid系统列。
行版本在其表中的物理位置。请注意,尽管 ctid 可用于非常快速地定位行版本,但如果行的 ctid 被 VACUUM FULL 更新或移动,则该行的 ctid 将更改。因此 ctid 作为长期行标识符是无用的。OID,或者更好的是用户定义的序列号,应该用于标识逻辑行。
? ctid列的数据类型是什么?
具体来说,我对 Postgres 10.3 版本感兴趣,但如果它在过去的版本中发生了变化,那会很高兴知道。
I have the following tables (taken from the Sakila database):
I am selecting a particular film. For this film, I also want all actors participating in that film. I have two queries for this: one with a LEFT JOIN and one with a LEFT JOIN LATERAL.
select film.film_id, film.title, a.actors
from film
left join
(
select film_actor.film_id, array_agg(first_name) as actors
from actor
inner …Run Code Online (Sandbox Code Playgroud) postgresql performance join execution-plan postgresql-10 postgresql-performance
我正在使用 Heroku 的 Postgres 选项并从中下载了一个备份。我想将它恢复到一个新的数据库中,以便我可以查看它。我一直在尝试不同的命令,但收效甚微。我的第一次尝试:
$ sudo -u postgres psql < db/backups/myapp_2018-05-27.pg.dump
The input is a PostgreSQL custom-format dump.
Use the pg_restore command-line client to restore this dump to a database.
Run Code Online (Sandbox Code Playgroud)
所以我尝试:
$ sudo -u postgres pg_restore -d myapp3 -C db/backups/myapp_2018-05-27.pg.dump
pg_restore: [archiver (db)] connection to database "myapp3" failed: FATAL: database "myapp3" does not exist
Run Code Online (Sandbox Code Playgroud)
我真的不明白这个-C选项。
-C --创建
在恢复之前创建数据库。如果还指定了 --clean,则在连接之前删除并重新创建目标数据库。
使用此选项时,以 -d 命名的数据库仅用于发出初始 DROP DATABASE 和 CREATE DATABASE 命令。所有数据都恢复到出现在存档中的数据库名称。
恢复到新数据库对我来说似乎是合乎逻辑的。我离题了……(也许这里已经正确解释了)
我尝试从另一个具有相同架构的较早版本的模板创建一个新数据库:
$ …Run Code Online (Sandbox Code Playgroud) postgresql ×10
datatypes ×1
functions ×1
heroku ×1
join ×1
performance ×1
pg-restore ×1
replication ×1
restore ×1
terminology ×1