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
.