Mise à jour de SQL Server avec des performances de sous-requête

Pourquoi cette requête utilisant une table temporaire pour une list d'identifiants, puis les mises à jour suivantes s'exécutent plus rapidement

DECLARE @temp TABLE ( id int ); INSERT INTO @temp select a.Id from aa a inner join bb b on b.id = a.source_id inner join cc c on c.document_id = a.id update aa set updated_at = GETDATE() where id in (select * from @temp) 

Par rapport à cette requête UPDATE qui utilise une sous-requête pour sélectionner une list d'identifiants qui prend beaucoup plus de time.

  update aa set updated_at = GETDATE() where id in (select a.Id from aa a inner join bb b on b.id = a.source_id inner join cc c on c.document_id = a.id) 

Pourquoi répétez-vous la table aa dans la sous-requête? Est-ce que cela fait la même chose?

 update aa set updated_at = GETDATE() where a.source_id in (select b.Id from b.id join cc c on c.document_id = a.id ); 

Il peut y avoir des circonstances où ce n'est pas la même chose, mais je suppose que c'est la logique.

En outre, vous pouvez écrire ceci sans aucune sous-requête:

 update a set updated_at = GETDATE() from aa a inner join bb b on b.id = a.source_id inner join cc c on c.document_id = a.id; 

Je m'attendrais à ce que cela ait de bonnes performances – à less que les jointures produisent de nombreux loggings répétés pour une ligne donnée dans aa .