Sqlserver
 sql >> Baza danych >  >> RDS >> Sqlserver

najszybszy sposób na aktualizację kolumny varchar z tekstem

To jest pytanie o „najszybszy”, więc czasy są podane poniżej

Konfiguracja testowa, tabela z>1 milionem wierszy

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)

Rzeczy vs Zastąp vs Podciąg

Podsumowanie skuteczności — STUFF> SUBSTRING> REPLACE

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

(dwa czasy pochodzą z wielu wykonań, aby pokazać zmienność, jest dość niski, więc czasy można uznać za dokładne z dokładnością do 3%)

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

Stała liczba vs PATINDEX vs CHARINDEX

(Wersja z ustaloną pozycją jest już podana powyżej)
Podsumowanie wydajności — STAŁE> (PATINDEX =CHARINDEX)

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

Uwagi:

  • Wszystkie powyższe instrukcje dotyczące aktualizacji będą działać (z poprawką lub dwoma) w zależności od Twoich potrzeb
  • Przed każdym testem cała tabela jest usuwana i ponownie tworzona, aby zapobiec problemom z buforowaniem

UWAGA!

Mimo że STUFF jest szybszy, możesz znaleźć się w trudnych sytuacjach. Jeśli Twoje dane zawierają

"MindWorksNoDot"

A aktualizujesz za pomocą

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

Skończysz z NULL! Ponieważ gdy CHARINDEX nie może znaleźć kropki, drugi parametr do STUFF równy zero (0) powoduje, że cały ciąg przechodzi do NULL .

KOŃCOWE SŁOWA

Ze względu na bezpieczeństwo i niezawodność, biorąc pod uwagę, że jest tylko o 33% wolniejsze niż podejście STUFF, użyłbym po prostu wyrażenia REPLACE, tj.

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. Jak przekonwertować dane do formatu json w SQL Server 2008?

  2. Jak usunąć zadanie agenta programu SQL Server w Azure Data Studio

  3. usuń duplikaty z przecinka lub ciągu operatora potoku

  4. potrzebna data w formacie rrrr-mm w mssql

  5. Kolumna tekstowa nie przechowująca więcej niż 8000 znaków