关于sql:PostgreSQL CASE语句需要索引吗?

PostgreSQL CASE statement requires indexes?

请教我一些建议。

我写了一个CASE语句来填充一个新字段。对于超过3亿条记录的数据库表,这大约需要12个小时。

1
2
3
4
5
6
7
8
UPDATE line
    SET code = (CASE
        WHEN (GROUP ='{Building}' AND term = '{Outline}') THEN 1
        WHEN (GROUP ='{Building}' AND term = '{Division}') THEN 2
        WHEN (GROUP ='{Building}' AND term = '{Partial}') THEN 3
    ELSE 99          
    END)
    WHERE code IS NULL;

我该怎么做才能提高性能?

我应该在运行case语句之前向代码列添加索引,以便它可以更快地找到具有NULL代码值的记录。

或者我应该在\\'group \\'和\\'term \\'列上创建索引以帮助加快速度。

对于如此大的表,创建任何索引将花费一些时间,因此必须平衡创建它们所花费的时间和所获得的性能提升。

感谢您的任何建议

编辑
附加信息

Am在Windows 2008 Server上使用PostgreSQL 9.2 64Bit
我使用了PostgreSQL Tuning Wiki并优化了postgresql.conf文件
我已经在桌子上做了VACUUME和ANALYZE


code上的索引不会帮助case语句,但是会帮助where。实际上,这上面有一个"允许"选项,因为索引和原始数据都需要更新。因此,如果所有code值都在NULL处,则索引将不会更快。

如果将其拆分为单独的更新,则groupterm上的索引会有所帮助:

1
2
3
UPDATE line
    SET code = 1
    WHERE code IS NULL AND GROUP = '{Building}' AND term = '{Outline}';

实际上,您想要的索引为line(code, group, term)


如果行数很多,请尝试:

编辑postgresql.conf和
将checkpoint_segments增加到10或更多(> =表的300Mio记录的空间)
将wal_buffers增加到16MB(或更大)

如果您切换,也可以获得更高的性能
fsync关闭
但是,您有丢失数据的风险!

代码索引可以加快更新速度(请参见doku):
"此外,索引列上的IS NULL或IS NOT NULL条件也可以与B树索引一起使用。"