我们的工作场所有一个数据库,其中包含一个包含 500 万条记录的客户表。每次更新客户端时,都会在包含 1 亿条记录的 client_history 表中添加另一行。Client 表中的所有列都已编入索引。仅索引客户端历史记录表中的主键 (ID)、外键 (FK_Client_ID) 和创建时间戳。
我被要求更新数十万客户记录,但前提是相应的客户历史记录表明客户记录自某个日期(例如 2012 年 9 月 19 日)以来没有更新。
我编写了一个使用 EXISTS 子句的 SQL 更新查询。DBA 告诉我不应该使用 EXISTS 子句,因为这会触发表空间扫描,从而减慢查询的执行速度。这显然是更新数十万客户记录时的问题 -
UPDATE Client_History SET Surname = 'MisterX',
Update_Timestamp = CURRENT_TIMESTAMP
WHERE (FK_Client_ID = 123 AND ID = 456)
AND NOT EXISTS
(SELECT *
FROM Client
WHERE Client.Client_Id = Client_History.FK_Client_ID
AND Client_History.Update_Timestamp > TIMESTAMP('2012-09-21-00:00:00')
AND Client_History.Update_Timestamp < TIMESTAMP('4000-12-31-00:00:00')
AND Client_History.Creation_Timestamp < NAME.Update_Timestamp);
谁能想到更好的解决方案?