Dites des enregistrements 10-20K pour mettre à jour dans une donnée SQL Server, et je dois faire quelque chose comme ce qui suit: -
UPDATE dbo.MyTable SET Field1 = 95 WHERE MyTableID = 348923 UPDATE dbo.MyTable SET Field1 = 90 WHERE MyTableID = 348924 UPDATE dbo.MyTable SET Field1 = 100 WHERE MyTableID = 348925
Quelqu'un peut-il informer quelle est la manière la plus efficace de le faire? P>
Merci. P> P>
4 Réponses :
Exécution de plusieurs requêtes peut être une approche efficace, car elle peut tirer parti de l'indice de clé primaire.
Vous pouvez également essayer d'utiliser des expressions conditionnelles, telles que: p>
WHERE MyTableID BETWEEN 348923 AND 348925
dans SQL Server, je recommanderais un Ceci devrait avoir essentiellement la même performance que l'utilisation de code>. Je trouve plus facile de gérer. Et beaucoup plus simple si vous souhaitez définir plusieurs colonnes. P> p> joindre code>:
Préparez un modèle de script Pour gérer les mises à jour en créant une variable de table comme ci-dessous
update t set t.Field1 = tbl.Field1 from dbo.MyTable t inner join @your_tbl_name tbl on t.MyTableID = tbl.MyTableID
Je pense que Gordon Linoff a offert une excellente approche. Pour déterminer si cela est possible, avez-vous besoin de mises à jour instantanées ou pouvez-vous les lotter?
Si vous pouvez les combiner, déterminez la fréquence à laquelle les mises à jour doivent réfléchir sur la table principale. Vous avez peut-être plus de chance d'ajouter toutes les modifications dans une table de mise en scène, puis d'exécution de mises à jour ultérieures. Cela dépend vraiment de la performance dont vous avez besoin et de ce qui mange votre performance aujourd'hui. Si vous avez un groupe d'utilisateurs individuels, toutes les mises à jour utilisent simultanément et que chaque utilisateur doit être en mesure de mettre à jour les données distinctes instantanément, il existe différentes approches à prendre en compte. Toutefois, si vous pouvez gérer la mise à jour de ces valeurs que de temps en temps, chariçez-les! Je reçois une tonne de mises à jour des entreprises qui vendent à ma société, et c'est la route que j'ai dû prendre pour l'efficacité. P>
Voici comment ce lot ressemblerait si vous pouvez utiliser une table de mise en scène. P>
--Creates a staging table
create table dbo.StageUpdates
(
ID int primary key
, NewValue int
)
--Adds values to update to staging table
insert into dbo.StageUpdates
VALUES
(348923, 95)
,(348924, 90)
,(348925, 100)
--Update values
update dbo.MyTable
set Field1 = NewValue
from dbo.MyTable as mt
inner join dbo.StageUpdates as su on mt.ID = su.ID
where su.NewValue <> mt.Field1 --Modify this if either value can be null.
--Clear updated values from stage
delete from dbo.StageUpdates
from dbo.StageUpdates as su
inner join dbo.MyTable as mt on su.ID = mt.ID
where su.NewValue <> mt.Field1 --Modify this if either value can be null.