Apa cara paling efisien untuk mengubah definisi kolom dalam tabel dengan jutaan baris

9

Saya perlu mengubah kolom dari NOT NULL ke NULL dalam tabel yang berisi jutaan baris. Saya sudah mencoba yang sederhana

alter table Table1 ALTER COLUMN Column1 XML NULL

tapi itu butuh selamanya. Jadi inilah pertanyaanku:

  1. Mengapa butuh waktu lama untuk menerapkan alter?
  2. Apakah ada cara yang lebih baik untuk melakukannya?
Jonas Stawski
sumber

Jawaban:

3

1) Seseorang akan membutuhkan lebih banyak info tentang struktur lengkap tabel + indeks non-cluster untuk mengetahui dengan benar apa yang terjadi tetapi kecurigaan saya ada hubungannya dengan bitmap NULL.

Silakan merujuk untuk detail lebih lanjut tentang topik ini. http://www.sqlskills.com/BLOGS/PAUL/post/Misconceptions-around-null-bitmap-size.aspx

http://www.sqlskills.com/BLOGS/PAUL/post/A-SQL-Server-DBA-myth-a-day-(630)-three-null-bitmap-myths.aspx

2) Ya, asalkan Anda memiliki ruang penyimpanan, buat tabel baru dengan nullability yang benar dan transfer data dalam beberapa batch untuk menghindari pertumbuhan log yang berlebihan dan beralih tabel menggunakan teknik yang tercantum di bawah ini. Saya telah melakukan ini beberapa kali dengan sedikit atau tanpa downtime sama sekali.

http://jahaines.blogspot.com/2009/12/sql-server-2005-how-to-move-10-millions.html

Sankar Reddy
sumber
6

Apakah akan lebih cepat untuk:

  1. Buat tabel baru dengan definisi yang benar untuk Column1
  2. INSERT INTO <NewTable> SELECT * FROM <OriginalTable>;
  3. Ganti nama OriginalTable menjadi OriginalTable_old; Ganti nama NewTable ke OriginalTable
  4. Validasi dan Jatuhkan OriginalTable_old

Keuntungannya di sini adalah Anda tidak memegang kunci pada tabel Asli selama durasi operasi. Tabel hanya boleh dikunci selama fase rename. (Ini mengasumsikan bahwa SQL Server mendukung perubahan nama tingkat objek.)

RobPaller
sumber
Ya, SQL Server mendukung penggantian nama tingkat objek menggunakan prosedur yang tersimpan sistem sp_rename.
gonsalu
Saya dapat mengubah kolom melalui cara ini dengan baris 3.5M dalam 1 menit.
Mohsen Afshin
2

Setiap baris harus disentuh ketika mengubah kolom dari NOT NULL ke NULL, itulah sebabnya dibutuhkan begitu lama untuk menyelesaikannya. Tidak ada cara untuk membuatnya membutuhkan waktu lebih sedikit.

mrdenny
sumber
1

Pilihan lain adalah membuat kolom baru dengan definisi yang benar untuk tabel yang dimaksud, Perbarui kolom dengan data dari kolom lama, lalu letakkan kolom lama.

Atau Anda dapat merujuk ke pos lama dari SE yang menangani masalah serupa pada kolom INT.

/programming/4311559/sql-server-performance-for-alter-table-alter-column-change-data-type

yrushka
sumber
Dalam kasus saya, kolom saya hanya penuh dengan NULL, jadi saya pikir ini akan menjadi cara untuk pergi, membuat kolom sepenuhnya NULL dengan nama yang tepat tidak memerlukan waktu sama sekali ... lalu menghapus kolom yang lama, alih-alih berurusan dengan jutaan sisipan ...
Zack
0

Jika Anda membuka monitor aktivitas SQL saat perintah sedang berjalan, Anda akan dapat mengetahui apakah itu benar-benar memprosesnya atau apakah ia menunggu beberapa bentuk kunci eksklusif dari tabel.

Matthew Steeples
sumber