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
如果将其拆分为单独的更新,则
1 2 3 | UPDATE line SET code = 1 WHERE code IS NULL AND GROUP = '{Building}' AND term = '{Outline}'; |
实际上,您想要的索引为
如果行数很多,请尝试:
编辑postgresql.conf和
将checkpoint_segments增加到10或更多(> =表的300Mio记录的空间)
将wal_buffers增加到16MB(或更大)
如果您切换,也可以获得更高的性能
fsync关闭
但是,您有丢失数据的风险!
代码索引可以加快更新速度(请参见doku):
"此外,索引列上的IS NULL或IS NOT NULL条件也可以与B树索引一起使用。"