参考如何从 PostgreSQL 中的选择查询将值插入表中?,
我想从另一个表行插入,由 SELECT DISTINCT 指定,加上一些静态值,例如:
INSERT INTO new_tbl (column1, column2, column3)
SELECT DISTINCT id FROM -- long where clause --,
'a string', 0;
Run Code Online (Sandbox Code Playgroud)
这样新表中的每一行都会为 column2 和 column3 获得相同的值这可能吗?
还有另一种方法可以将函数声明为返回一个集合,即使用语法 RETURNS TABLE(columns)。... 这种表示法是在 SQL 标准的最新版本中指定的,因此可能比使用 SETOF 更具可移植性。
这听起来好像RETURNS TABLE是返回多行的更新、更便携的样式。但我不确定这两种语法是否等效。
我想知道我们是否真的可以RETURNS TABLE用来代替 RETURNS SETOF?
特别是,我还没有弄清楚的一种情况是:如果我们有一个现有的表foo及其关联的复合类型,我们如何在 中使用它RETURNS TABLE?
使用上述链接的示例,可以使用以下内容重写RETURNS TABLE:
CREATE TABLE foo (fooid int, foosubid int, fooname text);
CREATE FUNCTION getfoo(int) RETURNS SETOF foo AS $$
SELECT * FROM foo WHERE fooid = $1;
$$ LANGUAGE SQL;
Run Code Online (Sandbox Code Playgroud)
到目前为止,我尝试使用RETURNS TABLE (foo.*)and RETURNS TABLE (foo),但没有用。
我有一个带有键(bigint) 和值(double)的 PostgreSQL 表。该表有数百亿行。我在 ( key , value )上有一个 btree 用于按键辅助查找。该表永远不会更新。
我在这个表上执行的唯一查询是在键上的相等谓词以获取相应的value,它利用了 B 树。
PostgreSQL 消耗的存储在这里很糟糕。它将OID、key、value存储在表中,并将key、value存储在索引中。我本质上是将所有东西存储两次!
如何配置此表以节省空间?理想情况下,如何在 B 树中只存储一次元组。
有没有人为 pgAdmin 版本和 PostgreSQL 版本整理过版本兼容性矩阵?
以前,我会将多个表合并为一个并返回结果,但在许多表中我有相同的列名。这就是为什么我决定用表名作为列名的前缀。但这打破了我必须自动更新我的updated_at专栏的触发器。
这是我的功能:
CREATE OR REPLACE FUNCTION update_updated_at()
RETURNS TRIGGER AS $$
BEGIN
NEW.updated_at = now();
RETURN NEW;
END;
$$ language 'plpgsql';
Run Code Online (Sandbox Code Playgroud)
我会添加一个触发器,如:
CREATE TRIGGER update_users_updated_at
BEFORE UPDATE ON users
FOR EACH ROW EXECUTE PROCEDURE update_updated_at();
Run Code Online (Sandbox Code Playgroud)
但是现在我的专栏被命名了users_updated_at,这不起作用。我的问题是有什么方法可以将列名传递给触发器并更新传递的列,还是有其他我不知道的方法?
有人可以向我解释这种行为吗?我在 OS X 上本机运行的 Postgres 9.3 上运行了以下查询。我试图模拟一些行为,其中索引大小可能增长得比表大小大得多,但发现了一些更奇怪的东西。
CREATE TABLE test(id int);
CREATE INDEX test_idx ON test(id);
CREATE FUNCTION test_index(batch_size integer, total_batches integer) RETURNS void AS $$
DECLARE
current_id integer := 1;
BEGIN
FOR i IN 1..total_batches LOOP
INSERT INTO test VALUES (current_id);
FOR j IN 1..batch_size LOOP
UPDATE test SET id = current_id + 1 WHERE id = current_id;
current_id := current_id + 1;
END LOOP;
END LOOP;
END;
$$ LANGUAGE plpgsql;
SELECT test_index(500, 10000);
Run Code Online (Sandbox Code Playgroud)
我让它在我的本地机器上运行了大约一个小时,然后我开始从 OS X 收到磁盘问题警告。我注意到 Postgres …
我有一个相当大的表(100 万行),我的数据库卡在这个表上的自动清理(> 30 分钟)上,导致整个数据库阻塞。应用程序现在甚至不会加载。
-00:37:31.137859 autovacuum: VACUUM public.users
Run Code Online (Sandbox Code Playgroud)
SELECT n_tup_del, n_tup_upd FROM pg_stat_all_tables WHERE relname = 'users';
Run Code Online (Sandbox Code Playgroud)
这些是我的用户表上的 autovacuum 设置:
-00:37:31.137859 autovacuum: VACUUM public.users
Run Code Online (Sandbox Code Playgroud)
我从慢 PostgreSQL 性能中使用的这些建议设置?不要忘记清空你的数据库
我只需要等待吗?我有哪些选择?
更新
我已升级到 Postgres 9.5,并将我的 RDS IOPS 增加到 900,并且真空过程仍然使 IOPS 达到最大值并且无法对数据库执行任何其他操作。该过程在升级前 1 天的某个时间点运行。
我还删除了我拥有的自定义 autovacuum 设置,现在只使用默认设置。
以下是这些查询结果的附件;
SELECT * FROM pg_stat_activity;
SELECT * FROM pg_stat_database;
SELECT * FROM pg_stat_user_tables;
SELECT * FROM pg_stat_user_indexes;
SELECT * FROM pg_locks;
Run Code Online (Sandbox Code Playgroud)
我在 amazon RDS 上使用 postgresql 9.5.4 和来自 rails 4.2 的约 1300 个持久连接,并带有“prepared_statements: false”。在数小时和数天的过程中,“可释放内存”RDS 统计数据继续无限期地下降,但每次我们重新连接(重新启动我们的服务器)时都会跳回到一个相对较小的工作集。如果我们让它持续太长时间,它会一直为零,并且数据库实例确实开始进入交换并最终失败。从我们重新启动时的峰值中减去几天内的可用内存,我们看到每个连接平均有 10 MB。
从增强监控中挖掘每个 pid RSS,我们看到示例连接 pid 的增长同样缓慢,但总 RSS 似乎只是每个连接实际内存使用量的代理(https://www.depesz.com/2012/ 06/09/how-much-ram-is-postgresql-using/)。
我怎样才能:
我有一个 Postgres 9.2 DB,其中某个表有很多不可移动的死行:
# SELECT * FROM public.pgstattuple('mytable');
table_len | tuple_count | tuple_len | tuple_percent | dead_tuple_count | dead_tuple_len | dead_tuple_percent | free_space | free_percent
------------+-------------+-----------+---------------+------------------+----------------+--------------------+------------+--------------
2850512896 | 283439 | 100900882 | 3.54 | 2537195 | 2666909495 | 93.56 | 50480156 | 1.77
(1 row)
Run Code Online (Sandbox Code Playgroud)
正常的吸尘也显示许多不可移动的死行:
# VACUUM VERBOSE mytable;
[...]
INFO: "mytable": found 0 removable, 2404332 nonremovable row versions in 309938 out of 316307 pages
DETAIL: 2298005 dead row versions cannot be removed yet.
There were 0 unused …Run Code Online (Sandbox Code Playgroud) 考虑以下示例:两个表foo和bar,每个表都有一个 jsonb 列。
对于foo,有一百万行 jsonb 的值是[{"a":123}]。
对于bar,有一百万行,其中 jsonb 的值是[{"very_long_key_not_premature_optimization_at_all":123}]
json key inbar比 in 长 46 个字符foo。的大小bar会比 4600 万字节大foo吗?
postgresql ×10
autovacuum ×1
aws ×1
functions ×1
insert ×1
json ×1
memory ×1
performance ×1
pgadmin ×1
plpgsql ×1
trigger ×1
vacuum ×1