sql >> Database teknologi >  >> RDS >> Sqlserver

hurtigste måde at opdatere varchar kolonne med tekst

Dette er et spørgsmål om "hurtigst", så timings er angivet nedenfor

Testopsætning, tabel med>1 million rækker

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)

Stuff vs Replace vs SubString

Ydeevneoversigt - TING> SUBSTRING> UDSKIFT

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

(de 2 gange er fra flere henrettelser for at vise variabiliteten, den er ret lav, så tiderne kan betragtes som nøjagtige inden for 3%)

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

Fast nummer vs PATINDEX vs CHARINDEX

(Versionen med fast position er allerede angivet ovenfor)
Ydeevneoversigt – FIXED> (PATINDEX =CHARINDEX)

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

Bemærkninger:

  • Alle opdateringserklæringer givet ovenfor vil fungere (med en justering eller to) afhængigt af dine behov
  • Før hver test slettes hele tabellen og genskabes for at forhindre cacheproblemer

FORSIGTIG!

Selvom STUFF er hurtigere, kan du komme i vanskelige situationer. Hvis dine data indeholder

"MindWorksNoDot"

Og du opdaterer ved hjælp af

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

Du ender med NULL! For når CHARINDEX ikke kan finde prikken, får den anden parameter til STUFF på nul (0) hele strengen til at gå til NULL .

SLUTTEORD

For sikkerhed og pålidelighed, da den kun er 33 % langsommere end STUFF-tilgangen, ville jeg blot bruge en REPLACE-sætning, dvs.

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


  1. Konverter django RawQuerySet til Queryset

  2. Oracle Stored Procedure-forespørgsel som ikke at arbejde med markøren

  3. Hvordan undslipper man strenge i SQL Server ved hjælp af PHP?

  4. Optager char / varchar / text / longtext kolonner i MySQL fuld størrelse i filsystemet selv for delvist udfyldte celler?