Database 基于另一个表更新表中的每一行
我正在做这个更新Database 基于另一个表更新表中的每一行,database,db2,Database,Db2,我正在做这个更新 UPDATE ROOM_DATE rd SET HOTEL_ID = ( SELECT hotel_id FROM ROOM_TYPE rt WHERE rt.ROOM_TYPE_ID = rd.room_type_id ) WHERE room_type_id < 40000 AND hotel_id IS NULL; 有一个桌子房间,需要添加一个酒店id。上面的查询根据ROOM_TYPE表中的hotel_id更新此id 这是可行的,但速度很慢。执行需要一个小
UPDATE ROOM_DATE rd SET HOTEL_ID = (
SELECT hotel_id FROM ROOM_TYPE rt WHERE rt.ROOM_TYPE_ID = rd.room_type_id
)
WHERE room_type_id < 40000 AND hotel_id IS NULL;
有一个桌子房间,需要添加一个酒店id。上面的查询根据ROOM_TYPE表中的hotel_id更新此id
这是可行的,但速度很慢。执行需要一个小时,所以我想知道是否有更好/更快的方法。您需要在连接中使用的列或where条件上建立索引。否则,您的数据库将执行一个很慢的完整表扫描 因此,在您的情况下,您需要索引: 房间\日期。房间\类型\ ID 房间\日期酒店\ ID
房间类型。房间类型ID所以我找到了一种方法,只需要几分钟。首先,我导出带有额外列hotel_id的表,该列取自room_type:
export to "./roomdate_new.data" of del modified by coldel|
SELECT rd.ROOM_TYPE_ID, rd.single_day_date, rd.numavail, rd.numtaken, rd.price, rt.hotel_id
FROM ROOM_TYPE rt, ROOM_DATE rd
WHERE rt.ROOM_TYPE_ID = rd.room_type_id;
然后我再次导入该表:
load from "./roomdate_new.data" of del modified by coldel| method P (1,2,3,4,5,6) replace INTO ROOM_DATE;
set integrity for ROOM_DATE allow no access immediate checked;
但我不认为这是特别优雅的。我更喜欢普通的SQL语句或过程。表有多大,表上有索引吗?表上没有索引,但连接在主键上。RoMoMeDime3.5m记录和ROMMyType是300 K记录。边问题:你应该考虑像自动生成的数字IDS之类的东西有一个合适的术语,但是我现在不能把它看作是内存地址,并把它们看作是随机的IE,与它们的密钥无关。因此,像WHERE room_type_id<40000这样的东西只适用于“分页”更新/删除,以保持事务量小,这就是我假设您在这里所做的-虽然在这种情况下您实际上不需要事务。我认为原因是选择on room_类型。它将在每次更新时完成。@Clockwork Muse您是对的。where子句仅用于缩短事务。如果我启动整个事务,db2会在2分钟后给出一个事务日志填充错误。房间类型id<40000是为了限制数量,酒店id为NULL是为了不更新已经更新的位置。我尝试了这个。房间类型id列是主键,并且已经有索引。所以我加了房间号。酒店号,但看起来更糟。我认为原因是我正在更新hotel_id,现在每次更新时都会重新创建索引。@Wisoft-不必重新创建,但必须更新。更大的问题可能是,如果大量记录只有hotel_id为NULL,这是一个非常低的基数,并且数据将以“shuffled”NULL开头,排序相同,因此不是在目的地排序。我想你说到点子上了。我删除了hotel_id为NULL,并且整个表的查询在2分钟左右超出了可接受的水平。谢谢你的帮助。