SQL Server mengubah tabel untuk mengubah TEXT menjadi NVARCHAR (MAX) sangat meningkatkan ukuran database

8

Saya perlu memperbarui database SQL Server yang berukuran sekitar 18GB untuk mengubah sejumlah TEXTkolom NVARCHAR(MAX).

Masalah yang saya alami adalah setelah menjalankan semua alter tableperintah database akhirnya berukuran hampir 26GB. Saya mengerti bahwa dari sini menggunakan NVARCHAR(MAX)akan memungkinkan DB tumbuh lebih lambat tetapi apakah ada cara bagi saya untuk mencegah kembung ini?

Aidan Lawless
sumber
2
Oh, jangan buat pertanyaan yang sama di sini. Cukup beri tanda pada SO dan mod akan memigrasikannya di sini dalam sekejap :-). Sekarang seseorang perlu bergabung / bersih..etc.
Marian
2
Apakah database lebih besar atau log sangat besar?
Aaron Bertrand
Maaf Marian, mengerti sekarang ...
Aidan Lawless
Aaron, file MDF jauh lebih besar .... hampir 10GB lebih besar
Aidan Lawless

Jawaban:

7

Saya berharap posting ini akan membantu Anda.

http://geekswithblogs.net/johnsPerfBlog/archive/2008/04/16/ntext-vs-nvarcharmax-in-sql-2005.aspx

Fakta-fakta kunci:

  • Secara default TEXT dan NTEXT menyimpan nilai teks dalam struktur LOB
  • Secara Default NVARCHAR (MAX) menyimpan nilai teks dalam struktur tabel (Kecuali jika lebih dari 8000 byte)
  • Ketika Anda mengubah kolom dari TEXT / NTEXT ke NVARCHAR (MAX), cara data disimpan tidak diubah, itu memperbarui metadata tabel saja. Struktur data hanya diubah pada saat nilai diubah. Ini dapat dilakukan segera dengan menjalankan sesuatu seperti ini:

      update mytable set mycolumn1 = mycolumn1
  • Jika Anda menggunakan pengaturan opsi tabel default untuk NVARCHAR (MAX), maka data di tabel Anda akan lebih besar.

    - Anda perlu melihat pengaturan opsi meja dan lingkungan sebelum mengubah pengaturan sesuai dengan kebutuhan Anda.

  • Ukuran tabel Anda akhirnya akan menyusut, jika Anda mengikuti pernyataan tabel alter Anda dengan pernyataan tabel pembaruan.

Singkatnya, jika Anda menjalankan pernyataan pembaruan, memaksa penyimpanan struktur data diubah, ukuran basis data Anda akan lebih kecil, seperti yang diharapkan.

EDIT : Seperti yang telah Anda sebutkan TEXT dan bukan NTEXT, keuntungan Anda dalam ruang akan kurang jelas dari yang Anda kira. NTEXT mengambil dua kali lipat jumlah ruang seperti yang dilakukan TEXT, tetapi pada saat yang sama, Anda harus mengharapkan NVARCHAR (MAX) mengambil sekitar setengah ruang seperti apa yang dilakukan NTEXT. Dengan perhitungan saya, Anda akan melihat sedikit perubahan dari ukuran database asli Anda.


Penghargaan khusus untuk http://www.douglubey.com/

RoKa
sumber
2
dapatkah Anda meringkas fakta-fakta penting di sini, kalau-kalau tautannya bisa mati.
Stephane Rolland
Seperti disebutkan dalam jawaban lain, TEXT vs NTEXT akan berdampak pada penyimpanan, tetapi tidak sebanyak yang Anda sarankan.
RoKa
Terima kasih ... Saya telah menunda bergabung selama bertahun-tahun sekarang ... Senang berada di sini.
RoKa
Terima kasih RoKA, itu telah membuat perbedaan yang signifikan untuk beberapa tabel yang dimaksud. Saya akan mengembalikan database lagi dan melakukannya secara bertahap untuk melihat pengaruhnya. Terima kasih lagi .....
Aidan Lawless
Dengan senang hati.
RoKa
6

Mungkin ada kekeliruan dalam pertanyaan Anda, tetapi Anda mengatakan TEXT ke NVARCHAR (maks) dan bukan NTEXT ke NVARCHAR (maks). Jika ini yang benar-benar Anda lakukan, Anda berubah dari ANSI ke UNICODE dan Anda tidak perlu kaget karena membutuhkan lebih banyak ruang (karakter byte tunggal vs karakter multi-byte).

spaghettidba
sumber
Ya, itulah yang saya lakukan ... walaupun berdasarkan beberapa perhitungan sederhana itu tidak menjelaskan ukuran kenaikannya.
Aidan Lawless
2
Sudahkah Anda mencoba dengan saran RoKa?
spaghettidba
1
@ AidanLawless perhitungan apa ini? Ukuran basis data harus meningkat setidaknya dengan ukuran TEXTbidang yang ada - pergi ke unicode membutuhkan tepat dua kali ruang penyimpanan ANSI.
JNK
2
@ JNK ... kecuali menggunakan kompresi pada 2008 R2 atau lebih baik, di mana kompresi Unicode akan memperlakukan karakter ASCII yang disimpan di NVARCHAR seperti VARCHAR.
Aaron Bertrand