sql >> Databasteknik >  >> RDS >> Sqlserver

snabbaste sättet att uppdatera varchar-kolumnen med text

Det här är en fråga om "snabbast", så tider anges nedan

Testinställningar, tabell med>1 miljon rader

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

Sammanfattning av prestanda - STUFF> SUBSTRING> ERSÄTT

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

(de två gångerna är från flera körningar för att visa variabiliteten, den är ganska låg så tiderna kan anses vara korrekta inom 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 finns redan ovan)
Prestandasammanfattning - FIXED> (PATINDEX =CHARINDEX)

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

Anmärkningar:

  • Alla uppdateringssatser ovan kommer att fungera (med en justering eller två) beroende på dina behov
  • Innan varje test släpps hela tabellen och återskapas för att förhindra cacheproblem

VARNING!

Även om STUFF är snabbare kan du hamna i knepiga situationer. Om dina uppgifter innehåller

"MindWorksNoDot"

Och du uppdaterar med

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

Du slutar med NULL! För när CHARINDEX inte kan hitta punkten, gör den andra parametern till STUFF på noll (0) att hela strängen går till NULL .

SLUTLIGA ORD

För säkerhet och tillförlitlighet, eftersom det bara är 33 % långsammare än STUFF-metoden, skulle jag helt enkelt använda en REPLACE-sats, dvs.

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


  1. GROUP BY - gruppera inte NULL

  2. MySQL 5.5.9 och Hibernate-tabellskapningsfel på TYPE

  3. SQL Server konverterar varbinary till sträng

  4. mysql_fetch_assoc()-fel när data i mysql-fältet ändras