标签: postgresql

postgresql 从选择查询插入,加上静态值

参考如何从 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 获得相同的值这可能吗?

postgresql insert

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

如何将 RETURNS TABLE 与 PostgreSQL 中的现有表一起使用?

来自此处的 PostgreSQL文档

还有另一种方法可以将函数声明为返回一个集合,即使用语法 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),但没有用。

postgresql set-returning-functions postgresql-9.5

8
推荐指数
1
解决办法
6088
查看次数

仅具有索引存储的 Postgresql

我有一个带有(bigint) 和(double)的 PostgreSQL 表。该表有数百亿行。我在 ( key , value )上有一个 btree 用于按键辅助查找。该表永远不会更新。

我在这个表上执行的唯一查询是在上的相等谓词以获取相应的value,它利用了 B 树。

PostgreSQL 消耗的存储在这里很糟糕。它将OIDkeyvalue存储在表中,并将keyvalue存储在索引中。我本质上是将所有东西存储两次!

如何配置此表以节省空间?理想情况下,如何在 B 树中只存储一次元组。

postgresql performance postgresql-performance

8
推荐指数
1
解决办法
1050
查看次数

8
推荐指数
1
解决办法
4713
查看次数

PostgreSQL:使用自定义列自动更新 updated_at

以前,我会将多个表合并为一个并返回结果,但在许多表中我有相同的列名。这就是为什么我决定用表名作为列名的前缀。但这打破了我必须自动更新我的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,这不起作用。我的问题是有什么方法可以将列名传递给触发器并更新传递的列,还是有其他我不知道的方法?

postgresql trigger plpgsql functions row-modification-time

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

有人可以解释执行数百万个更新的奇怪行为吗?

有人可以向我解释这种行为吗?我在 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 …

postgresql

8
推荐指数
2
解决办法
245
查看次数

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)

http://www.filedropper.com/output_5

postgresql aws postgresql-9.5 autovacuum

8
推荐指数
1
解决办法
3890
查看次数

如何找到 postgresql 每个连接内存泄漏的来源?

我在 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/)。

在此处输入图片说明

我怎样才能:

  1. 更改下面的 default.postgres9.5 参数以避免每个连接无限制的内存增长
  2. 确定哪些查询会导致这种无限增长并更改它们以防止它
  3. 确定导致这种无限增长的缓冲/缓存类型,以便我可以使用它来执行上述任一操作

在此处输入图片说明

postgresql memory max-connections

8
推荐指数
1
解决办法
2400
查看次数

VACUUM VERBOSE 输出,不可移除的“死行版本无法移除”?

我有一个 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)

postgresql vacuum

8
推荐指数
2
解决办法
8291
查看次数

jsonb 键的长名称是否使用更多存储空间?

考虑以下示例:两个表foobar,每个表都有一个 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 json

8
推荐指数
1
解决办法
1638
查看次数