A quel point le sur-classment est-il mauvais?

J'ai la requête suivante, je me demandais à quel point la construction de CAS est mauvaise, Elle force DB Engine à écraser E.EAOpID avec la valeur qui est déjà contenue dans E.EAOpID quand elle n'est pas nulle

UPDATE E SET E.EAOpID = CASE WHEN E.EAOpID IS NULL THEN @operationID ELSE E.EAOpID END, E.AverageCapacity = E.AverageCapacity + 1, E.Average = E.Average - (E.Average - E.Value) / E.AverageCapacity FROM ( SELECT E.EAOpID, E.AverageCapacity, E.Average, P.Value FROM Probes AS P INNER JOIN Estimates AS E ON P.EstimateID = E.ID WHERE P.EAOpID = @operationID ) AS E; 

Peut-être que c'est less cher de split cette mise à jour en deux mises à jour:

1

 UPDATE E SET E.EAOpID = @operationID FROM ( SELECT E.EAOpID, E.AverageCapacity, E.Average, P.Value FROM Probes AS P INNER JOIN Estimates AS E ON P.EstimateID = E.ID WHERE P.EAOpID = @operationID AND E.EAOpID IS NULL -- Additional statement here ) AS E; 

2

 UPDATE E SET E.AverageCapacity = E.AverageCapacity + 1, E.Average = E.Average - (E.Average - E.Value) / E.AverageCapacity FROM ( SELECT E.EAOpID, E.AverageCapacity, E.Average, P.Value FROM Probes AS P INNER JOIN Estimates AS E ON P.EstimateID = E.ID WHERE P.EAOpID = @operationID ) AS E; 

La mise à jour d'une ligne même si aucune valeur n'a changé implique très peu de ressources. Vous pouvez imposer plus de charge en vérifiant simplement les changements. Vous pourriez envisager une optimization comme celle-ci lorsque votre système est très raffiné et que vous êtes proche du bord, mais ce serait faible sur la list.

Deux mises à jour utilisent presque deux fois plus de ressources, puisque vous lisez / mettez à jour le même set de lignes. Beter d'avoir tout en une seule requête. Je ne sais pas comment mesurer combien de traitement supplémentaire est requirejs par l'instruction de cas, mais je sais que la suite effectue la même quantité de travail en utilisant less de logique de encoding. Changez de

 UPDATE E SET E.EAOpID = CASE WHEN E.EAOpID IS NULL THEN @operationID ELSE E.EAOpID END, (etc) 

à

 UPDATE E SET E.EAOpID = isnull(E.EAOpID, @operationID), (etc) 

(Vous pouvez utiliser coalesce au lieu de isnull si cela vous rend heureux.)

Plus vous utilisez de fonctionnalités SQL Server sur la table, plus il y a de surcharge, même avec une UPDATE sans opération.

Les opérations et les lectures supplémentaires sont effectuées au-delà de la maintenance de l'index.

Déclencheurs (les triggersurs sont déclenchés), les foreign keys (l'intégrité est toujours vérifiée), les contraintes (les règles sont vérifiées), etc.

Par exemple: append une contrainte à une table qui échouerait avec certaines des valeurs existantes, mais en utilisant "WITH NOCHECK" pour créer. Mettre à jour une colonne existante à elle-même; la mise à jour échoue sur la contrainte même si la valeur n'a pas changé.