-1

我们的工作场所有一个数据库,其中包含一个包含 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);

谁能想到更好的解决方案?

4

1 回答 1

0

黑暗中的一枪:尝试将所有常量提升到主查询中(它们所属的位置)

UPDATE Client_History ch
 SET Surname = 'MisterX'
     , Update_Timestamp = CURRENT_TIMESTAMP 
 WHERE ch.FK_Client_ID = 123
   AND ch.ID = 456
   AND ch.Update_Timestamp > TIMESTAMP('2012-09-21-00:00:00')
   AND ch.Update_Timestamp < TIMESTAMP('4000-12-31-00:00:00')
   AND ch.Creation_Timestamp < NAME.Update_Timestamp
   AND NOT EXISTS (
     SELECT * 
     FROM Client cl
     WHERE cl.Client_Id = ch.FK_Client_ID
     )
   ;

顺便说一句:什么是NAME?某种伪表,如 Oracle 的dual

于 2013-03-04T00:22:33.970 回答