2011-04-01 2 views
0

J'ai une instruction pour mettre à jour un champ si un enregistrement de table connexe existe. La requête est mise à jour pour chaque enregistrement. Je n'étais pas sûr de ce que la façon la plus efficace/meilleure pratique de le faire serait. Jusqu'à présent, je suis venu avec 2 solutionsCas VS Mises à jour multiples

Solution One: Déclaration de cas

UPDATE item 
SET IsRestricted = 
    CASE 
     WHEN restriction.Id is null THEN 0 
     ELSE 1 
    END 
FROM [dbo].[Item] item 
    left join [dbo].[Restriction] restriction 
     on restriction.Id = item.Id 

Solution Deux: déclarations de mise à jour multiples

UPDATE item 
SET IsRestricted = 1 
FROM [dbo].[Restriction] restriction 
    inner join [dbo].[Item] item 
     on restriction.Id = item.Id 

UPDATE item 
SET IsRestricted = 0 
FROM [dbo].[Item] item 
    left join [dbo].[Restriction] restriction 
     on item.Id = restriction.Id 
WHERE restriction.Id is null 

Si quelqu'un pouvait me aider à évaluer qui Je devrais l'utiliser serait apprécié. Je ne sais pas s'il s'agit d'un article en double, pour l'instant seulement ceux que j'ai vu impliquent des déclencheurs ou d'autres choses et je ne sais pas si cela change la réponse. N'hésitez pas à suggérer des approches alternatives

+0

Avez-vous besoin de la colonne IsRestricted? Ne pas interroger pour la présence/l'absence de restrictions à un moment choisi vous garantit-il toujours la bonne réponse? –

+2

Mettez les deux dans la même fenêtre de requête, activez « Inclure plan d'exécution réelle » (ctrl + m), exécutez le lot, observer les résultats :) – Blorgbeard

+0

@Damien le drapeau est là parce que l'utilisation de la base de données va être assez intense performances et nous ne voulons pas avoir à faire des recherches au moment choisi. Bien que je ne cherchais pas vraiment une réponse spécifique à mon problème autant qu'une comparaison générale des deux méthodes, – Manatherin

Répondre

0

Eh bien, après quelques tests de performance, il semble qu'ils sont à la fois les mêmes performances sage

1

Comme certaines personnes l'ont mentionné, vous pouvez effectuer des tests de performance et vérifier le plan d'exécution pour déterminer lequel est le plus performant.

Si vous ne faites que lancer cette instruction une fois que j'utiliserais la première méthode, comme vous le savez, vous devrez mettre à jour tous les enregistrements et une instruction gardera les choses simples et agréables. Si cela va être exécuté plusieurs fois (c'est-à-dire quand de nouvelles données sont ajoutées) alors j'utiliserais la deuxième solution avec une addition à la clause where en vérifiant que ce n'est déjà pas 0/1 quand vous le réglez à nouveau. Cela devrait garder le traitement au minimum.