【问题标题】:Query taking too much time in PostgreSQL查询在 PostgreSQL 中花费了太多时间
【发布时间】:2019-11-02 04:27:07
【问题描述】:

我的表有 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

【问题讨论】:

  • 索引创建有问题吗?
  • 索引无济于事 - 问题是您通过循环执行的逐行处理效率低下且缓慢。
  • 请注意,Postgres 9.1 是no longer supported,您应该尽快计划升级。

标签: postgresql sql-update postgresql-9.1 query-performance


【解决方案1】:

在循环中执行数百万次单行更新是使任何关系数据库崩溃的可靠方法。你可以用一条 UPDATE 语句做你想做的事:

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

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

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

但是,如果您要更新大量总行数,则没有索引会有所帮助。事实上,添加索引可能会减慢速度。

【讨论】:

    猜你喜欢
    • 2013-07-11
    • 2018-07-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-08-04
    • 2012-06-04
    相关资源
    最近更新 更多