请听一些建议。
我写了一个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
答案 0 :(得分:3)
code
上的索引不会对case
语句有所帮助,但它会对where
有所帮助。实际上有一个“给予和接受”,因为索引需要更新以及原始数据。因此,如果所有code
值都在NULL
,则索引不会更快。
group
和term
上的索引可以帮助,如果将其拆分为单独的更新:
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树索引一起使用。”