Sqlserver
 sql >> Base de données >  >> RDS >> Sqlserver

moyen le plus rapide de mettre à jour la colonne varchar avec du texte

Il s'agit d'une question sur "le plus rapide", donc les horaires sont fournis ci-dessous

Configuration du test, tableau avec>1 million de lignes

create table MetaDataServe (id int identity primary key, vc varchar(max));

insert MetaDataServe values
('MindWorks.Accounts'),
('MindWorks.Transactions'),
('MindWorks.Commissions');

insert MetaDataServe
select vc
from MetaDataServe, master..spt_values a, master..spt_values b
where b.number between 1 and 30
-- (1090110 row(s) affected)

 Éléments vs Remplacer vs SubString

Résumé des performances – STUFF > SUBSTRING > REPLACE

update MetaDataServe set vc = STUFF(vc, 9, 0, '.Client')

(les 2 temps proviennent de plusieurs exécutions pour montrer la variabilité, il est assez faible donc les temps peuvent être considérés comme précis à moins de 3%)

update MetaDataServe set vc = REPLACE(vc, '.', '.Client.')
update MetaDataServe set vc = 'MindWorks.Client.' + SUBSTRING(vc, 11, 100)

Nombre fixe vs PATINDEX vs CHARINDEX

(La version à position fixe est déjà donnée ci-dessus)
Résumé des performances - FIXE> (PATINDEX =CHARINDEX)

update MetaDataServe set vc = STUFF(vc, PATINDEX('%.%',vc), 0, '.Client')
update MetaDataServe set vc = STUFF(vc, CHARINDEX('.',vc), 0, '.Client')

Remarques :

  • Toutes les déclarations de mise à jour données ci-dessus fonctionneront (avec un ou deux ajustements) en fonction de vos besoins
  • Avant chaque test, la table entière est supprimée et recréée pour éviter les problèmes de mise en cache

ATTENTION !

Même si STUFF est plus rapide, vous pouvez vous retrouver dans des situations délicates. Si vos données contiennent

"MindWorksNoDot"

Et vous mettez à jour en utilisant

update MetaDataServe set vc = STUFF(vc, CHARINDEX('.',vc), 0, '.Client')

Vous vous retrouvez avec NULL ! Parce que lorsque CHARINDEX ne peut pas trouver le point, le deuxième paramètre de STUFF de zéro (0) fait passer la chaîne entière à NULL .

DERNIERES MOTS

Pour des raisons de sécurité et de fiabilité, étant donné qu'elle n'est que 33 % plus lente que l'approche STUFF, j'utiliserais simplement une instruction REPLACE, c'est-à-dire

update MetaDataServe set vc = REPLACE(vc, '.', '.Client.')