sql >> Databáze >  >> RDS >> Sqlserver

nejrychlejší způsob aktualizace sloupce varchar textem

Toto je otázka „nejrychlejší“, takže časování je uvedeno níže

Nastavení testu, tabulka s>1 milionem řádků

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)

Věci vs. Nahradit vs Podřetězec

Shrnutí výkonu – STUFF> SUBSTRING> REPLACE

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

(dva časy jsou z vícenásobných provedení, aby se ukázala variabilita, je poměrně nízká, takže časy lze považovat za přesné s přesností 3 %)

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

Pevné číslo vs PATINDEX vs CHARINDEX

(Verze s pevnou pozicí je již uvedena výše)
Přehled výkonu – OPRAVENO> (PATINDEX =CHARINDEX)

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

Poznámky:

  • Všechna výše uvedená prohlášení o aktualizaci budou fungovat (s jedním nebo dvěma úpravami) v závislosti na vašich potřebách
  • Před každým testem je celá tabulka odstraněna a znovu vytvořena, aby se předešlo problémům s mezipamětí.

POZOR!

I když je STUFF rychlejší, můžete se dostat do ošemetných situací. Pokud vaše data obsahují

"MindWorksNoDot"

A aktualizujete pomocí

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

Skončíte s NULL! Protože když CHARINDEX nemůže najít tečku, druhý parametr STUFF nula (0) způsobí, že celý řetězec přejde na NULL .

ZÁVĚREČNÁ SLOVA

Kvůli bezpečnosti a spolehlivosti, protože je pouze o 33 % pomalejší než přístup STUFF, bych jednoduše použil příkaz REPLACE, tj.

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


  1. Jak aktualizovat řádky dvou tabulek, které mají omezení cizího klíče

  2. PostgreSQL index na JSON

  3. Funkce PL/pgSQL:Jak vrátit normální tabulku s více sloupci pomocí příkazu execute

  4. Prozkoumání možností čekání na zámek s nízkou prioritou v SQL Server 2014 CTP1