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

modo più veloce per aggiornare la colonna varchar con il testo

Questa è una domanda sul "più veloce", quindi i tempi sono forniti di seguito

Impostazione di prova, tabella con>1 milione di righe

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)

Roba vs Sostituisci vs Sottostringa

Riepilogo prestazioni - STUFF> SUBSTRING> REPLACE

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

(i 2 tempi provengono da più esecuzioni per mostrare la variabilità, è piuttosto basso quindi i tempi possono essere considerati accurati entro il 3%)

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

Numero fisso vs PATINDEX vs CHARINDEX

(La versione a posizione fissa è già data sopra)
Riepilogo delle prestazioni - RISOLTO> (PATINDEX =CHARINDEX)

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

Note:

  • Tutte le istruzioni di aggiornamento fornite sopra funzioneranno (con una o due modifiche) a seconda delle tue esigenze
  • Prima di ogni test, l'intera tabella viene eliminata e ricreata per evitare problemi di memorizzazione nella cache

ATTENZIONE!

Anche se STUFF è più veloce, puoi entrare in situazioni difficili. Se i tuoi dati contengono

"MindWorksNoDot"

E aggiorni usando

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

Finisci con NULL! Perché quando CHARINDEX non riesce a trovare il punto, il secondo parametro su STUFF pari a zero (0) fa sì che l'intera stringa vada a NULL .

PAROLE FINALI

Per sicurezza e affidabilità, dato che è solo il 33% più lento dell'approccio STUFF, userei semplicemente un'istruzione REPLACE, ad es.

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