Saat memperbesar ukuran kolom VARCHAR pada meja besar, mungkinkah ada masalah?

87

Saya menggunakan SQL Server 2008 dan saya perlu membuat bidang VARCHAR lebih besar, dari (200 hingga 1200) di atas meja dengan sekitar 500 ribu baris. Yang perlu saya ketahui adalah jika ada masalah yang belum saya pertimbangkan.

Saya akan menggunakan pernyataan TSQL ini:

ALTER TABLE MyTable
ALTER COLUMN [MyColumn] VARCHAR(1200)

Saya sudah mencobanya pada salinan data dan pernyataan ini tidak memiliki efek buruk yang dapat saya lihat.

Jadi, apakah ada kemungkinan masalah dari melakukan ini yang mungkin belum saya pertimbangkan?

Omong-omong, kolom tersebut tidak diindeks.

Paul T Davies
sumber
1
@nonnb: itu adalah ide yang buruk. stackoverflow.com/q/2091284/27535
gbn
@gbn ada pendapat tentang jawaban Justin baru-baru ini untuk pertanyaan itu? Tampaknya agak bertentangan dengan Anda.
AakashM
@AakashM: dia benar tentang penyimpanan tetapi ini adalah overhead, bukan pengoptimalan. Sekarang baca stackoverflow.com/q/2009694/27535
gbn
@gbn - poin yang bagus, seperti pengamatan Martin Smith tentang pengindeksan. Ditarik.
StuartLC
2
Ternyata pada akhirnya ada satu gotcha! Bidang diindeks, dan ketika seseorang mencoba memasukkan entri yang lebih besar dari 900b, gagal! Berhati-hatilah.
Paul T Davies

Jawaban:

59

Ini hanya perubahan metadata: cepat.

Pengamatan: tentukan NULL atau NOT NULL secara eksplisit untuk menghindari "kecelakaan" jika salah satu pengaturan SET ANSI_xx berbeda misalnya dijalankan di osql bukan SSMS karena beberapa alasan

gbn
sumber
1
Semua baik-baik saja dengan ini. Tidak ada masalah.
Paul T Davies
Tahukah Anda jika aturan yang sama berlaku saat pergi dari varchar(200)ke varchar(max)?
CodeNaked
@ CodeNaked: ini jauh lebih sulit untuk dijawab. (max) adalah tipe LOB yang bisa "di baris" atau di luar baris. Namun, saya cenderung mengatakan itu harus sama karena datanya sudah "dalam baris" dan tidak diperlukan
pembuatan ulang
12

Hanya ingin menambahkan 2 sen saya, karena saya mencari pertanyaan ini di Google b / c saya menemukan diri saya dalam situasi yang sama ...

WASPADALAH bahwa meskipun mengubah dari varchar(xxx)menjadi varchar(yyy)memang merupakan perubahan meta-data, tetapi berubah menjadi varchar(max)tidak. Karena varchar(max)nilai (alias nilai BLOB - gambar / teks dll) disimpan secara berbeda pada disk, tidak dalam baris tabel, tetapi "di luar baris". Jadi server akan menjadi gila di atas meja besar dan menjadi tidak responsif selama beberapa menit (jam).

--no downtime
ALTER TABLE MyTable ALTER COLUMN [MyColumn] VARCHAR(1200)

--huge downtime
ALTER TABLE MyTable ALTER COLUMN [MyColumn] VARCHAR(max)

PS. yang sama berlaku untuk nvarcharatau kursus.

jazzcat
sumber
4

Mengubah ke Varchar (1200) dari Varchar (200) seharusnya tidak menimbulkan masalah karena ini hanya perubahan metadata dan karena SQL server 2008 memotong ruang kosong yang berlebihan, Anda seharusnya tidak melihat perbedaan kinerja, jadi singkatnya seharusnya tidak ada masalah dengan membuat perubahan.

Kprice84
sumber
Saya yakin ini mungkin benar untuk tabel kecil, tetapi untuk tabel besar yang secara aktif ditanyai, ini dapat memblokir untuk sejumlah besar waktu (karena server SQL perlu melihat apakah perlu memotong setiap baris).
CodeNaked
0

Alasan lain mengapa Anda harus menghindari konversi kolom menjadi varchar (max) adalah karena Anda tidak dapat membuat indeks pada kolom varchar (max).

psikorski
sumber
-3

Dalam kasus saya, kolom perubahan tidak berfungsi sehingga seseorang dapat menggunakan perintah 'Ubah', seperti:

mengubah tabel [nama_tabel] MENGUBAH kolom [nama_kolom] varchar (1200);

Gourav Singla
sumber
5
Itu karena Anda tidak menggunakan SQL Server per pertanyaan (tapi mungkin MySQL). "ALTER TABLE ... MODIFY" bukan T-SQL yang valid.
Jeroen Mostert