我是 postgres 的新手,
我在实时服务器上有一个 2000 万行的表 - 我需要删除大部分行但不是全部。我想这样做而不影响访问此表的其他读/写进程(非常频繁)。
我有一种方法可以一次删除大约 100-400K 行块。在每次删除之间,我想让查询休眠 - 以便其他操作可以有机会访问此表。
我有代码,但我相信这个版本,它在查询运行的整个时间(所有睡眠)都锁定表。我怎样才能在进程休眠时真正释放表?谢谢!!
到目前为止我的代码:
CREATE SEQUENCE tmp_sq increment by 1 minvalue 1 maxvalue 53 start with 1;
DO $$
DECLARE
w_counter integer;
BEGIN
w_counter := (SELECT nextval('tmp_sq'));
while w_counter < 53 loop
raise notice 'Value: %', w_counter ;
w_counter := (SELECT nextval('tmp_sq'));
-- this way of breaking up the delete into chunks works for my table because of dates.
delete from table_a where date_part('week',my_date) = w_counter;
raise notice ' …
Run Code Online (Sandbox Code Playgroud) 我需要在我的数据库上加载 uuid 扩展,这是在运行时创建的。创建数据库的用户不是超级用户,她只有“CREATEDB”权限。
有没有办法做到这一点?谢谢。
Postgres 9.3 Debian 7.0
我为特定用户创建了特定模式,并在此模式中为该用户创建了一个视图,因此这是他知道存在的唯一表。问题是这个用户需要使用这个表的主键的序列,但它说“错误:序列的权限被拒绝”
原始表及其序列属于模式 A。此用户的模式 B 具有此表 T 的可插入视图。我不能为该用户授予模式 A 的使用权,否则他将能够看到所有的名称和定义我的桌子。
问题是:有没有办法为这个序列创建某种视图,以便他可以调用 nextval() 和 currval()?目标是使该序列可用于该受限用户,而无需让他访问该序列实际所属的主模式。
我对 SP(存储过程)和 UDF(用户定义函数)的使用感到困惑。通常,也可以在数据库之外的程序中编写代码。
是否有任何一般建议来决定何时使用它们?
search_path
假设我像这样永久更改我的数据库:
ALTER DATABASE my_db SET search_path TO "$user",public,other_schema;
Run Code Online (Sandbox Code Playgroud)
如何将其重置回该集群上原始的、未更改的数据库所具有的默认值?
这通常是这样"$user",public
,但可以通过配置文件进行更改。有一种方法可以读取来自配置文件的参数值(因此我可以在最坏的情况下构建动态查询),但我没有找到任何类似的东西。