sql >> Database >  >> RDS >> Sqlserver

snelste manier om varchar-kolom met tekst bij te werken

Dit is een vraag over 'snelst', dus de tijden staan ​​hieronder

Testopstelling, tabel met>1 miljoen rijen

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

Prestatiesamenvatting - STUFF> SUBSTRING> VERVANGEN

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

(de 2 tijden zijn van meerdere uitvoeringen om de variabiliteit te laten zien, het is vrij laag, dus de tijden kunnen als nauwkeurig worden beschouwd tot op 3%)

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

Vast nummer vs PATINDEX vs CHARINDEX

(De versie met vaste positie is hierboven al gegeven)
Prestatiesamenvatting - OPGELOST> (PATINDEX =CHARINDEX)

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

Opmerkingen:

  • Alle bovenstaande update-instructies werken (met een of twee aanpassingen) afhankelijk van uw behoeften
  • Vóór elke test wordt de hele tabel verwijderd en opnieuw gemaakt om cacheproblemen te voorkomen

LET OP!

Ook al is STUFF sneller, je kunt in lastige situaties terechtkomen. Als uw gegevens

"MindWorksNoDot"

En je update met

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

Je eindigt met NULL! Omdat wanneer CHARINDEX de punt niet kan vinden, de tweede parameter van STUFF van nul (0) ervoor zorgt dat de hele string naar NULL gaat .

SLOTWOORDEN

Voor veiligheid en betrouwbaarheid, aangezien het slechts 33% langzamer is dan de STUFF-aanpak, zou ik gewoon een REPLACE-statement gebruiken, d.w.z.

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


  1. Is er een manier om een ​​filesort te vermijden wanneer de volgorde van verschilt van de waar-clausule?

  2. Verbinding maken met mySQL via C++

  3. Wat is het beste gegevenstype voor telefoonnummer in MySQL en wat moet Java-typetoewijzing daarvoor zijn?

  4. Kiezen uit een door komma's gescheiden veld