Sql 不使用'更新大表中的记录;在';陈述

Sql 不使用'更新大表中的记录;在';陈述,sql,tsql,Sql,Tsql,这张桌子很大,有数百万条记录 表1有三列 一个ID,X列和Y列。目前我使用的是一个“in”语句,速度很慢;尤其是在一张大桌子上。我希望在不使用in语句的情况下提高此update语句的性能。非常感谢您的帮助 Update [Table1] set Column_X='Delete' where Column_Y in( select distinct (Column_Y) from [Table1] where Column_X='Delete' ) re

这张桌子很大,有数百万条记录

表1有三列

一个ID,X列和Y列。目前我使用的是一个“in”语句,速度很慢;尤其是在一张大桌子上。我希望在不使用in语句的情况下提高此update语句的性能。非常感谢您的帮助

    Update [Table1] set Column_X='Delete' where Column_Y in(    
    select distinct (Column_Y) from [Table1]  where Column_X='Delete'
    )

   result before running script
   Table 1

   ID     Column X    Column Y      
   1      Delete      CAT           
   2      x1          CAT           
   3      x1          CAT        
   4      x1          COW           
   5      x1          COW     
   6      x2          Moon           
   7      Delete      Chicken         


   Intended result after running script
   Table 1

   ID     Column X    Column Y      
   1      Delete      CAT           
   2      Delete      CAT           
   3      Delete      CAT        
   4      x1          COW           
   5      x1          COW     
   6      x2          Moon           
   7      Delete      Chicken   

您可以在此基础上使用exists子句

Update [Table1] set Column_X='Delete' from [Table1] t1where exists(
select t2.Column_Y
from [Table1] t2
where t2.Column_X = 'Delete'
and t2.Column_Y = t1.Column_Y)
它应该比“in”子句快一点


注意:永远不要使用“in”,因为它会进行全表扫描。“Exists”子句应该适用于几乎所有情况。

您可以在FROM子句中多次使用同一个表,例如:

update Table1
   set Column_X = 'Delete'
  from Table1 a, Table1 b
 where a.Column_Y = b.Column_Y
   and b.Column_X = 'Delete'
更新影响表1的第一个实例,即“a”