Sqlserver
 sql >> Datenbank >  >> RDS >> Sqlserver

schnellste Möglichkeit, die varchar-Spalte mit Text zu aktualisieren

Dies ist eine Frage zu "am schnellsten", daher werden die Zeiten unten angegeben

Testaufbau, Tabelle mit>1 Million Zeilen

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

Leistungszusammenfassung – STUFF> SUBSTRING> REPLACE

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

(Die 2 Zeiten stammen von mehreren Ausführungen, um die Variabilität zu zeigen, sie ist ziemlich gering, sodass die Zeiten auf 3 % genau angesehen werden können.

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

Feste Zahl vs. PATINDEX vs. CHARINDEX

(Die Version mit fester Position ist bereits oben angegeben)
Leistungszusammenfassung – BEHOBEN> (PATINDEX =CHARINDEX)

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

Anmerkungen:

  • Alle oben angegebenen Update-Anweisungen funktionieren (mit ein oder zwei Anpassungen), je nach Ihren Anforderungen
  • Vor jedem Test wird die gesamte Tabelle gelöscht und neu erstellt, um Caching-Probleme zu vermeiden

ACHTUNG !

Auch wenn STUFF schneller ist, kann man in knifflige Situationen geraten. Wenn Ihre Daten

enthalten
"MindWorksNoDot"

Und Sie aktualisieren mit

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

Sie enden mit NULL! Denn wenn CHARINDEX den Punkt nicht finden kann, bewirkt der zweite Parameter von STUFF von Null (0), dass die gesamte Zeichenfolge auf NULL geht .

SCHLUSSWORTE

Da es nur 33 % langsamer als der STUFF-Ansatz ist, würde ich aus Sicherheits- und Zuverlässigkeitsgründen einfach eine REPLACE-Anweisung verwenden, d. h.

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