Sqlserver
 sql >> Base de Dados >  >> RDS >> Sqlserver

maneira mais rápida de atualizar a coluna varchar com texto


Esta é uma pergunta sobre "mais rápido", então os horários são fornecidos abaixo

Configuração de teste, tabela com>1 milhão de linhas

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)

Coisas x Substituir x SubString


Resumo de desempenho - STUFF> SUBSTRING> REPLACE
update MetaDataServe set vc = STUFF(vc, 9, 0, '.Client')

(os 2 tempos são de várias execuções para mostrar a variabilidade, é bastante baixo para que os tempos possam ser considerados precisos dentro de 3%)
update MetaDataServe set vc = REPLACE(vc, '.', '.Client.')
update MetaDataServe set vc = 'MindWorks.Client.' + SUBSTRING(vc, 11, 100)

Número fixo vs PATINDEX vs CHARINDEX


(A versão de posição fixa já é fornecida acima)
Resumo de desempenho - CORRIGIDO> (PATINDEX =CHARINDEX)

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

Observações:

  • Todas as instruções de atualização fornecidas acima funcionarão (com um ou dois ajustes) dependendo de suas necessidades
  • Antes de cada teste, a tabela inteira é descartada e recriada para evitar problemas de armazenamento em cache

CUIDADO!


Mesmo que o STUFF seja mais rápido, você pode entrar em situações complicadas. Se os seus dados contiverem
"MindWorksNoDot"

E você atualiza usando
update MetaDataServe set vc = STUFF(vc, CHARINDEX('.',vc), 0, '.Client')

Você acaba com NULL! Porque quando CHARINDEX não consegue encontrar o ponto, o segundo parâmetro para STUFF de zero (0) faz com que toda a string vá para NULL .

PALAVRAS FINAIS


Para segurança e confiabilidade, dado que é apenas 33% mais lento que a abordagem STUFF, eu simplesmente usaria uma instrução REPLACE, ou seja,
update MetaDataServe set vc = REPLACE(vc, '.', '.Client.')