A表2个字段 a1,a2
B表2个字段 b1,b2,b3A表(大约600万数据)记录:
a1    a2
100   null
237   null
166   null
...B表(大约10万数据)记录:
b1    b2    b3
0     150   AA
200   300   BB
153   188   CC
...执行SQL:
update A set a2=(select b3 from B where A.a1 between B.b1 and B.b2);数据量很大,这种update如何建索引

解决方案 »

  1.   

    update 建立索引干什么??update建立索引,只会让update运行更慢,不建立索引是最好的。
      

  2.   

    update也可以用索引呀。两个表数据量这么大,不走索引得跑多长时间呀
      

  3.   

    A表(大约600万数据)
    B表(大约10万数据)因为A表数据量大,建立索引后,更新的时候,每更新一条记录,都需要更新维护对应的索引,另外A表中a2字段是空值,建立索引无效,只能建立在a1上,而在查询语句中需要用到a1字段,显然,如果a1上有索引,查询会加快,但是后面又要更新a1字段,更新速度会变慢,总之,楼主自己掂量了...
      

  4.   

    你更新A表所有的记录肯定是走全表扫描,
    在说你的更新语句是update A set a2=(select b3 from B where A.a1 between B.b1 and B.b2);
    相当于相关子查询,做为相关子查询肯定是先扫描你A表的记录一条条的扫描
    你A表有600W的记录B表有10W条记录至少会扫描600W*10W条记录
    你可以试下这个查询需要多久,如果不长的话,使用
    select A1,(select b3 from B where A.a1 between B.b1 and B.b2) A2 from A
    CREATE TABLE AA as select A1,(select b3 from B where A.a1 between B.b1 and B.b2) A2 from A
    来创建个表,然后将AA表改名成A表
      

  5.   

    如果非要建索引 B表的B1,B2,B3建复合索引
    表A的A1建索引。
    但估计数据库的执行计划还是会走全表扫描或者索引范围扫描,这要看你建索引的后的执行计划与不建索引执行计划的测试了。
    总之建索引不一定给你带来性能的提高。