sql >> Base de Datos >  >> RDS >> Sqlserver

forma más rápida de actualizar la columna varchar con texto

Esta es una pregunta sobre "más rápido", por lo que los tiempos se proporcionan a continuación

Configuración de prueba, tabla con>1 millón de filas

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)

Cosas vs Reemplazo vs SubCadena

Resumen de rendimiento - COSAS> SUBCADENA> REEMPLAZAR

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

(los 2 tiempos son de múltiples ejecuciones para mostrar la variabilidad, es bastante bajo, por lo que los tiempos pueden considerarse precisos dentro del 3%)

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

Número fijo vs PATINDEX vs CHARINDEX

(La versión de posición fija ya se da arriba)
Resumen de rendimiento - FIJO> (PATINDEX =CHARINDEX)

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

Notas:

  • Todas las declaraciones de actualización proporcionadas anteriormente funcionarán (con un ajuste o dos) según sus necesidades
  • Antes de cada prueba, la tabla completa se elimina y se vuelve a crear para evitar problemas de almacenamiento en caché

¡PRECAUCIÓN!

Aunque STUFF es más rápido, puedes enfrentarte a situaciones difíciles. Si sus datos contienen

"MindWorksNoDot"

Y actualizas usando

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

¡Terminas con NULL! Porque cuando CHARINDEX no puede encontrar el punto, el segundo parámetro de STUFF de cero (0) hace que toda la cadena vaya a NULL .

PALABRAS FINALES

Por seguridad y confiabilidad, dado que es solo un 33% más lento que el enfoque STUFF, simplemente usaría una instrucción REPLACE, es decir,

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