Sqlserver
 sql >> Teknologi Basis Data >  >> RDS >> Sqlserver

cara tercepat untuk memperbarui kolom varchar dengan teks

Ini adalah pertanyaan tentang "tercepat", jadi waktunya disediakan di bawah

Pengaturan pengujian, tabel dengan>1 juta baris

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)

Barang vs Ganti vs SubString

Ringkasan Kinerja - STUFF> SUBSTRING> GANTI

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

(2 kali dari beberapa eksekusi untuk menunjukkan variabilitas, cukup rendah sehingga waktu dapat dianggap akurat dalam 3%)

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

Nomor tetap vs PATINDEX vs CHARINDEX

(Versi posisi tetap sudah diberikan di atas)
Ringkasan Kinerja - TETAP> (PATINDEX =CHARINDEX)

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

Catatan:

  • Semua pernyataan pembaruan yang diberikan di atas akan berfungsi (dengan satu atau dua penyesuaian) tergantung pada kebutuhan Anda
  • Sebelum setiap pengujian, seluruh tabel dihapus dan dibuat ulang untuk mencegah masalah cache

PERHATIAN !

Meskipun STUFF lebih cepat, Anda bisa masuk ke situasi sulit. Jika data Anda berisi

"MindWorksNoDot"

Dan Anda memperbarui menggunakan

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

Anda berakhir dengan NULL! Karena ketika CHARINDEX tidak dapat menemukan titik, parameter kedua ke STUFF nol (0) menyebabkan seluruh string menjadi NULL .

KATA AKHIR

Untuk keamanan dan keandalan, mengingat hanya 33% lebih lambat daripada pendekatan STUFF, saya hanya akan menggunakan pernyataan REPLACE, yaitu

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. T-SQL MERGE Performa dalam konteks penerbitan biasa

  2. Membuat replikasi antara SQL Server 2000 (penerbit) dan SQL Server 2008 (pelanggan)

  3. Batas catatan tabel sementara di server Sql

  4. Batasi akses pengguna ke tabel menggunakan Sql Server 2008

  5. Cara Menonaktifkan Semua Batasan PERIKSA &Kunci Asing dalam Database di SQL Server (Contoh T-SQL)