相关疑难解决方法(0)

将串行列添加到大表的最有效方法

将 BIGSERIAL 列添加到大表(约 3 Bil. 行,约 174Gb)的最快方法是什么?

编辑:

  • 我希望该列是现有行 ( NOT NULL) 的递增值。
  • 我没有设置填充因子(回想起来,这似乎是一个错误的决定)。
  • 我对磁盘空间没有问题,只是希望它尽可能快。

postgresql performance sequence update

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

如何确定列是否定义为串行数据类型而不是基于目录的整数?

所以我目前正在创建一些 SQL 来读取 postgres (9.1) 目录以构建表定义。但是,我遇到了 SERIAL/BIGSERIAL 数据类型的问题。

例子:

CREATE TABLE cruft.temp ( id BIGSERIAL PRIMARY KEY );
SELECT * FROM information_schema.columns WHERE table_schema='cruft' AND table_name='temp';
"db","cruft","temp","id",1,"nextval('cruft.temp_id_seq'::regclass)","NO","bigint",,,64,2,0,,,,,,,,,,,,,"db","pg_catalog","int8",,,,,"1","NO","NO",,,,,,,"NEVER",,"YES"
Run Code Online (Sandbox Code Playgroud)

它给了我数据库名 (db)、模式名 (cruft)、表名 (temp)、列名 (id)、默认值 (nextval( ... )) 和数据类型(bigint 和 int8 .. NOT bigserial) ...我意识到我可以检查默认值是否是一个序列 - 但我不相信这会是 100% 准确的,因为我可以手动创建一个序列并创建一个非序列列,其中默认值是那个顺序。

有没有人对我如何实现这一点有建议?除了检查 nextval(*_seq) 的默认值之外还有什么别的方法吗?

针对 TL;DR 或不熟悉 pg_catalog 的新用户在此处添加的 SQL 解决方案进行了编辑:

with sequences as (
  select oid, relname as sequencename from pg_class where relkind = 'S'
) select
  sch.nspname as schemaname, tab.relname as tablename, col.attname …
Run Code Online (Sandbox Code Playgroud)

postgresql

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

使用动态 SQL 重置串行 PK 的顺序

如何使用字符串和DECLARE变量的组合动态引用序列名称(如下所示)?下面的代码是否正确或者是否有其他方法可以做到这一点?

DO我的目标是出于性能原因在/块中执行此操作BEGIN,而且它将通过做一些有用的事情来帮助我理解 plpgsql,因此除非确实必须,否则我不会将其混合到 PHP 中。

DO $$
 DECLARE PKEY VARCHAR;
BEGIN

SELECT pg_attribute.attname INTO PKEY 
FROM pg_index, pg_class, pg_attribute 
WHERE pg_class.oid = 'parts1'::regclass 
AND indrelid = pg_class.oid 
AND pg_attribute.attrelid = pg_class.oid 
AND pg_attribute.attnum = any(pg_index.indkey) 
AND indisprimary;

--SELECT setval('parts1_id_seq', (SELECT MAX(pkey) + 1 FROM parts));
SELECT setval('parts1_' || PKEY || '_seq', (SELECT MAX(pkey) + 1 FROM parts));

  END;
$$ LANGUAGE plpgsql;
Run Code Online (Sandbox Code Playgroud)

postgresql auto-increment dynamic-sql plpgsql

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