请教各位大师阿.现在小弟在使用一个postgresql数据库.有张叫raw_data的表存储了一千多万条数据.现在想更新该表的叫status_code的值,想把它更新为0之前查询了下status_code不为0的值,大概有67万条.为什么直接用:update raw_data set status_code = '0';执行了一个晚上都没有反应呢? 大家帮帮忙啊.等着大家回复.之前我看了下表,在status_code上面有索引.可是我把索引删除以后,执行更新语句还是没有反应.希望大家给点意见阿.

解决方案 »

  1.   

    你建索引啊,然后后面加个where子句。
    你这样,就是把整张表都更新了,把为0也更新一遍了
    update raw_data set status_code ='0' where status_code <>'0'
    建索引会比不建索引很快一些的
      

  2.   

    应该不会这么慢,你是用的客户端工具执行的sql吗?你在dos命令行执行看有没有问题
      

  3.   

    先谢谢你哈。问题在status_code建立了索引,在更新这个字段的时候,索引也要更新吧。这样有索引的话,不是速度就慢了吗?主要是现在这张表的上千万条数据status_code的值都要更新成0,因为都要用到这些数据。
      

  4.   

    索引不是边更新边建立的,在更新完以后reindex就好了
    绝对比不建索引花在update上面少多了
      

  5.   

    我是在linux上面用的psql 执行的
      

  6.   


    哦。原来是这样的,那建立索引的时间是算在update上面的吗?我之前也问过别人一些提高插入数据效率的方法。他们普遍都说:如果有索引的话,现把索引删除了,再插入数据,最后再建立索引。
    我想更新操作也应该类似吧。我现在正在数据库上测试,到底有索引update快一点还是没有索引快一点
      

  7.   


    where status_code  <>'0' 这句话估计系统不会使用索引了。参考: B-tree 可以处理那些可以按照某种顺序存储的数据的等于和范围查询。 特别是在一个建立了索引的列涉及到使用下列操作符之一进行比较的时候, PostgreSQL 的查询规划器都会考虑使用 B-tree 索引∶<
    <=
    =
    >=
    >
      

  8.   

    忘记了
    用>0或者<0就ok了
      

  9.   

    要是你status_code都是>0就用>0好了
      

  10.   

    刚刚测试完毕。10万条数据。直接用update raw_data set status_code='0';花费了大概3分钟(机器配置比较差)在status_code上面建立索引以后再 update raw_data set status_code='0'; 花费了大概5分钟。
    说明有索引开销确实要大一点
      

  11.   

    你建索引,然后使用where查询,再试试
      

  12.   

    是啊。谢谢你了。执行没有反应,实在是很郁闷阿。之前考虑过化整为零,把这上千万条数据一部分一部分的更新。但是按照raw_data表里的site_t来划分。
    察看了下,也有上万个不同的值。实在是想不到办法啊。
      

  13.   

    恩。加上where的话,有索引确实会块很多的。主要是现在的状况是全部都要更新。
      

  14.   

    建索引,where过滤。
    sql优化参考 http://topic.csdn.net/u/20080808/14/DFC973E7-FCF2-4526-9DE1-FA5EFC148F5C.htmlnnd,我的2000多万条,有什么心得去回复我的提问:http://topic.csdn.net/u/20080822/18/73c7b002-65c9-462d-9197-eb6e8452124c.html
      

  15.   

    索引本身就有双面性,当用到它的时候,他起积极作用。当UPDATE、DELETE用不到它的时候,数据库要多维护索引,所以反而起阻碍作用。所以并不是所有的字段都可建索引,要权衡一下。象statu_code不为0为67万条,其他9百万条都为0,象这种有大量重复值分布的字段就不适合用索引,若果真的要用索引,可用带有where条件的索引(postgresql独创)
      

  16.   

    先说声谢谢.这位仁兄说的很有道理啊.之所以要在statu_code建立索引,是因为后面的程序实际上还要查询出statu_code为0的这些记录.然后再处理这些数据.在这个项目中,statu_code为0的纪录实际上有上千万条的.所以索引还是必要的.之前,我尝试了先删除索引,更新好了以后再把索引建立起来.起到了一定的效果.昨天更新700多万条数据,带索引的,花了一天一夜...