查询在PostgreSQL中花费太多时间

问题描述 投票:0回答:1

我的桌子上有2000万条记录。我的表包含两个字段(empno,ename)。 empno列包含值,但某些ename列不包含值。所以我试图使用下面的块来更新ename列。我为empno列创建了索引,但是此下面的块运行了10个以上小时(未完成)

create table index_test(empno integer,ename varchar(50))

create index ix_index_test on index_test(empno,ename)



DO $$
<<first_block>>
DECLARE
X RECORD;
BEGIN
FOR X IN(SELECT EMPNO FROM INDEX_TEST)
LOOP
UPDATE INDEX_TEST SET ENAME='Raja'||x.empno where empno=x.empno AND ENAME IS NULL;
END LOOP;
END first_block $$;

样本数据

Empno     ENAME
15346070  Raja15346070
14208203
15392731
17419579
13287096
optimization indexing postgresql-9.1
1个回答
0
投票

循环进行数百万个单行更新是降低任何关系数据库的可靠方法。您可以使用单个UPDATE语句执行所需的操作:

UPDATE index_test 
   SET ename = 'Raja'||empno 
WHERE ename IS NULL;

如果仅一小部分行在ename列中包含NULL值,那么以下索引可能会有所帮助:

create index on index_test (empno)
where ename is null;

但是如果要更新大量的总行,则没有索引会有所帮助。实际上,添加索引可能会使速度变慢。

© www.soinside.com 2019 - 2024. All rights reserved.