Sqlserver
 sql >> база данни >  >> RDS >> Sqlserver

най-бързият начин за актуализиране на колона varchar с текст

Това е въпрос за „най-бърз“, така че времената са дадени по-долу

Настройка на теста, таблица с>1 милион реда

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)

Неща срещу Замяна срещу Подниз

Обобщение на производителността - НЕЩА> ПОДНИЗ> ЗАМЕНИТЕ

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

(2-те времена са от множество изпълнения, за да се покаже променливостта, тя е доста ниска, така че времената могат да се считат за точни до 3%)

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

Фиксиран номер срещу PATINDEX срещу CHARINDEX

(Версията с фиксирана позиция вече е дадена по-горе)
Резюме на производителността - ФИКСИРАН> (PATINDEX =CHARINDEX)

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

Бележки:

  • Всички инструкции за актуализиране, дадени по-горе, ще работят (с една или две настройки) в зависимост от вашите нужди
  • Преди всеки тест цялата таблица се премахва и се създава отново, за да се предотвратят проблеми с кеширането

ВНИМАНИЕ!

Въпреки че STUFF е по-бърз, можете да попаднете в трудни ситуации. Ако вашите данни съдържат

"MindWorksNoDot"

И актуализирате с помощта на

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

Завършвате с NULL! Тъй като когато CHARINDEX не може да намери точката, вторият параметър на STUFF от нула (0) кара целия низ да премине към NULL .

ЗАКЛЮЧИТЕЛНИ ДУМИ

За безопасност и надеждност, като се има предвид, че е само с 33% по-бавен от подхода STUFF, бих използвал просто оператор REPLACE, т.е.

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


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. разделяне на колона за дата и час на година, месец и седмица

  2. Производителност на SQL Server 2005 заявка

  3. Множество клаузи OUTPUT в SQL команди MERGE/INSERT/DELETE?

  4. Наистина ли трябва да използвам SET XACT_ABORT ON?

  5. Генериране на отчет от URL - SQL Server Reporting Services 2008