Saya punya tabel di SQL Server 2012 Express dengan banyak ruang yang tidak digunakan.
Saya perlu mengosongkan ruang dalam database.
| NAME | BARIS | DILINDUNGI | DATA | INDEX_SIZE | UNUSED | | ------------- | -------- | -------------- | ----------- --- | ------------ | -------------- | | MyTableName | 158890 | 8928296 KB | 5760944 KB | 2248 KB | 3165104 KB |
Bagaimana cara saya mendapatkan SQL untuk merilis 3165104KB?
Saya sudah mencoba:
Alter table MyTableName Rebuild
DBCC CLEANTABLE (MyDbName,"MyTableName ", 0)
ALTER INDEX ALL ON MyTableName REORGANIZE ;
ALTER INDEX PK_Image ON MyTableName REBUILD WITH (ONLINE = OFF)
Ini tabelnya:
CREATE TABLE [dbo].[MyTableName](
[ImageID] [int] IDENTITY(1,1) NOT NULL,
[DateScan] [datetime] NULL,
[ScanImage] [image] NULL,
CONSTRAINT [PK_Image] PRIMARY KEY CLUSTERED
(
[ImageID] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF,
ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON, FILLFACTOR = 100) ON [PRIMARY]
) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]
GO
Satu-satunya hal yang telah kami lakukan diganti ScanImage
pada setiap baris dengan gambar yang jauh lebih kecil (ini adalah seberapa banyak ruang yang tidak digunakan di sana).
sumber
Mencoba
ALTER INDEX PK_Image ON MyTableName REBUILD WITH (ONLINE = OFF)
Ini membuat ulang indeks berkerumun, sehingga Anda akan membutuhkan ruang tambahan di database Anda untuk menyelesaikan operasi. Jika Anda tidak memiliki ruang tambahan karena disk Anda penuh, Anda mungkin dapat menambahkan file data baru ke database (pada disk yang berbeda) dan memindahkan tabel ke sana.
Mungkin juga indeks yang dikelompokkan ditentukan dengan FILLFACTOR kurang dari 100%. Memiliki faktor pengisian diatur ke, misalnya 66%, akan membuat 1/3 dari setiap halaman data kosong untuk digunakan di masa depan. Jika ini masalahnya, Anda bisa memodifikasi faktor pengisi menggunakan
ALTER INDEX PK_Image ON MyTableName REBUILD WITH (ONLINE = OFF, FILLFACTOR=100)
Jika Anda baru saja menjatuhkan bidang panjang variabel dari tabel, Anda juga bisa mencoba
DBCC CLEANTABLE( Databasename, "MyTableName")
Buku online (BOL) memiliki artikel hebat tentang indeks pembangunan kembali di http://technet.microsoft.com/en-us/library/ms188388%28v=sql.100%29.aspx
sumber
Pastikan mode pemulihan DB
SIMPLE
.ubah kolom sebagai
VARBINARY(MAX)
.Kemudian coba salin data ke tabel yang sama sekali baru.
Periksa ukuran tabel baru menggunakan
sp_spaceused "tablename"
. Jika Anda puas dengan ruang tabel yang tidak digunakan, maka periksa ruang database yang tidak digunakan menggunakan perintah yang sama tanpa menentukan nama tabel. Ruang itu masih dalam file database dan tidak dirilis ke OS.Anda dapat menjatuhkan tabel asli dan mengganti nama tabel baru, atau melakukan hal yang sama lagi, dan menggunakan nama tabel asli jika Anda tidak percaya operasi penggantian nama, (Saya tidak percaya sepenuhnya).
Jika ini berhasil maka langkah terakhir mudah: Anda tahu cara mengecilkan file dan melepaskan ruang yang tidak digunakan.
Jika ada kunci asing, catat definisi mereka, lepaskan, lakukan tugas yang saya sebutkan di atas, dan buat ulang kunci asing sesudahnya. Tentu saja ini akan memakan waktu dan operasi ini harus dilakukan selama waktu libur. Seluruh tugas ini dapat dilakukan melalui skrip juga untuk membuatnya berjalan dalam semalam.
sumber
Saya hanya akan membuat database baru dan menyalin datanya. Anda harus dapat menggunakan panduan impor / ekspor. (Jelas cadangan dan pemulihan akan menjaga masalah.) Periksa hasil pengimporan data. Jika semua terlihat bagus, ganti nama database asli dan kemudian ganti nama database baru dengan nama yang ingin Anda gunakan. (Saya selalu menunggu sedikit sebelum menjatuhkan yang asli, hanya untuk mengecek online.)
Untuk apa nilainya, kami juga telah mereklamasi ruang gumpalan dari database, jika mereka tidak terlalu besar, dengan langkah-langkah berikut. (Namun, karena Anda menggunakan SQL Server Express, Anda mungkin tidak memiliki ruang untuk mencoba ini.)
DBCC SHRINKFILE(file, EMPTYFILE)
. Karena Anda menyusutkan MDF, akhirnya ia akan gagal, karena metadata sistem tidak dapat dipindahkan. Namun, alokasi gumpalan kosong tidak dipindahkan.DBCC SHRINKFILE(newfile,EMPTYFILE)
. Ini akan memindahkan data kembali, dikurangi ruang berlebih.Ini menghilangkan gumpalan gumpalan. Saya harus menyebutkan bahwa kami telah menggunakan teknik ini terutama untuk membuat database yang sebagian besar kosong untuk menguji skrip upgrade.
sumber
Atur kembali indeks berkerumun - bahwa seseorang memiliki data di node, jadi .... kemungkinan terfragmentasi.
sumber