PostgreSQL CASE语句需要索引吗?

时间:2014-11-05 11:04:33

标签: sql postgresql

请听一些建议。

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

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'上创建索引以帮助加快它的速度。

使用表这么大,创建任何索引需要一段时间,因此必须平衡创建它们所花费的时间以及由此产生的性能提升。

感谢您的任何建议

EDIT 其他信息

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

2 个答案:

答案 0 :(得分:3)

code上的索引不会对case语句有所帮助,但它会对where有所帮助。实际上有一个“给予和接受”,因为索引需要更新以及原始数据。因此,如果所有code值都在NULL,则索引不会更快。

groupterm上的索引可以帮助,如果将其拆分为单独的更新:

UPDATE line
    SET code = 1
    WHERE code is null and group = '{Building}' and term = '{Outline}';

实际上,您需要的索引是line(code, group, term)

答案 1 :(得分:0)

如果您有大量行,请尝试:

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

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

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