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如何建索引
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如何建索引
B表(大约10万数据)因为A表数据量大,建立索引后,更新的时候,每更新一条记录,都需要更新维护对应的索引,另外A表中a2字段是空值,建立索引无效,只能建立在a1上,而在查询语句中需要用到a1字段,显然,如果a1上有索引,查询会加快,但是后面又要更新a1字段,更新速度会变慢,总之,楼主自己掂量了...
在说你的更新语句是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表
表A的A1建索引。
但估计数据库的执行计划还是会走全表扫描或者索引范围扫描,这要看你建索引的后的执行计划与不建索引执行计划的测试了。
总之建索引不一定给你带来性能的提高。