Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/database/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Database 基于另一个表更新表中的每一行_Database_Db2 - Fatal编程技术网

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分钟左右超出了可接受的水平。谢谢你的帮助。