Artikel ini merupakan upaya membedah output dari sp_spaceused prosedur tersimpan.
Pengantar
Memahami internal penggunaan database dan tren pertumbuhan memainkan peran penting dalam menentukan ukuran database yang tepat. sp_spaceused mungkin adalah prosedur tersimpan sistem yang paling banyak dijalankan oleh administrator untuk menemukan ruang disk yang digunakan oleh database. Ini membantu mendapatkan gambaran sekilas tentang penggunaan database. statistik. sp_spaceused digunakan untuk menampilkan jumlah baris, ukuran data, ukuran indeks, jumlah ruang yang digunakan, ruang yang tidak digunakan oleh setiap objek, dan ukuran database yang tidak terisi. Meskipun melihat nilai yang diberikan oleh sp_spaceused, orang tidak boleh berpikir untuk mengecilkan database atau file data atau file log. Sering kali, kita tidak menyadari apa yang kita lakukan. Sering kali, kita tidak tahu apa yang akan menjadi efek samping dari melakukan operasi intrinsik sumber daya tersebut. Output dari sp_spaceused memberi tahu kita banyak tentang kinerja database saat ini. tidak terisi kolom dan tidak digunakan kolom memberitahu kami ruang kosong yang tersisa di database dan tingkat tabel.
Artikel ini mempertimbangkan:
- Mengintip sp_spaceused
- Dampak setelan pertumbuhan otomatis pada kolom, tidak terisi dan tidak digunakan
- Menemukan detail penggunaan ruang di database dan tingkat instance
- Mengukur peristiwa pertumbuhan otomatis
- Menemukan ukuran file mdf dan ldf
- Faktor yang menentukan performa database
- Dan banyak lagi…
Internal sp_spaceused
Tangkap detail penggunaan ruang dari semua tabel
Dalam T-SQL di bawah ini, prosedur tersimpan tidak berdokumen sp_MSforeachtable digunakan untuk melintasi semua tabel dalam cakupan konteks database saat ini untuk mendapatkan metrik penggunaan ruang dari semua tabel dalam konteks.
Declare @tbl_sp_spaceused table( name varchar(100) NULL, rows bigint NULL, reserved varchar(20) NULL, data varchar(20) NULL, index_size varchar(20) NULL, unused varchar(20) NULL ) -- insert output of sp_spaceused to table variable INSERT INTO @tbl_sp_spaceused ( name, rows, reserved, data, index_size, unused ) EXEC sp_MSforeachtable @command1 = 'EXEC sp_spaceused [?]' SELECT * FROM @tbl_sp_spaceused order by rows desc
Tangkap detail penggunaan ruang dari semua database
Prosedur tersimpan yang tidak terdokumentasi sp_MSforeachDB digunakan untuk melintasi seluruh database dalam lingkup instans SQL saat ini untuk mendapatkan informasi penggunaan ruang dari semua database.
declare @tbl_sp_spaceusedDBs table( database_name varchar(100) NOT NULL, database_size varchar(50) NULL, unallocated varchar(30) NULL, reserved varchar(20) NULL, data varchar(20) NULL, index_size varchar(20) NULL, unused varchar(20) NULL ) INSERT INTO @tbl_sp_spaceusedDBs ( database_name, database_size, unallocated, reserved, data, index_size, unused ) EXEC sp_msforeachdb @command1="use ? exec sp_spaceused @oneresultset = 1" SELECT * FROM @tbl_sp_spaceusedDBs ORDER BY database_name, database_size
Di sini, nama_database adalah nama database; dalam hal ini, PythonSample . ukuran_database adalah Udialokasikan+Reserved+Data+Indeks+Tidak Digunakan =MDF +LDF (=848 MB dalam hal ini). tidak terisi ruang di sini adalah 51,94 MB.
Pada kenyataannya, ini adalah batas disk yang telah ditandai untuk database. Sp_spaceused output kolom tidak terisi yang ditentukan pada tingkat database dan tidak disediakan untuk tabel mana pun dan dapat diambil oleh objek pertama yang mengklaim lebih banyak ruang untuk berkembang.
tidak terisi space adalah ruang kosong di dalam file data sehingga tidak harus bertambah secara otomatis setiap kali Anda mengeluarkan kueri; biasanya, SQL Server Storage Engine mengelola pertumbuhan otomatis menggunakan mekanisme yang dikenal sebagai Algoritma Isi Proporsional. Pengelolaan ekstensi dilakukan secara efektif berdasarkan jumlah penulisan yang terjadi pada file. Dan pada saat yang sama, ketika ruang yang digunakan mencapai ambang batas, sebuah peristiwa dipicu untuk pertumbuhan otomatis lebih lanjut. Menetapkan nilai yang tepat dari ruang yang tidak terisi tergantung pada kebutuhan dan situasi, dan sifat penggunaan database. Ruang yang tidak terisi adalah ruang yang belum digunakan, dan “untuk diperebutkan”. Intinya, ekstensi ini ditandai dengan bit 1 di halaman GAM. Memahami konsep pertumbuhan otomatis dari atas, semua jenis pertumbuhan dapat menghasilkan perluasan yang tidak terisi lebih lanjut.
Dengan menggunakan kueri SQL berikut, kita dapat melihat berapa kali peristiwa pertumbuhan otomatis dibuat, bersama dengan jumlah waktu yang disimpan database untuk proses tersebut.
DECLARE @fname NVARCHAR(1000); -- Get the name of the current default trace SELECT @fname = CAST(value AS VARCHAR(MAX)) FROM ::fn_trace_getinfo(DEFAULT) WHERE traceid = 1 AND property = 2; SELECT ft.StartTime [Start Time] ,t.name [Event Name] ,DB_NAME(ft.databaseid) [Database Name] ,ft.Filename [File Name] ,(ft.IntegerData*8)/1024.0 [Growth MB] ,(ft.duration/1000) [Duration MS] FROM ::fn_trace_gettable(@fname, DEFAULT) AS ft INNER JOIN sys.trace_events AS t ON ft.EventClass = t.trace_event_id WHERE (ft.EventClass = 92 -- DateFile Auto-growth OR ft.EventClass = 93) -- LogFile Auto-growth ORDER BY ft.StartTime
Mari kita lihat apa arti masing-masing istilah:
Dipesan :Ruang yang disediakan untuk digunakan oleh objek database =(Data +Indeks + Tidak Digunakan ) =476704 + 1280 + 1312 =479296 KB. Ini menunjukkan seberapa penuh objek tersebut; idealnya, 10% dari ruang yang tidak terpakai diharapkan untuk tabel transaksional.
Data :Ukuran sebenarnya dari data. Ini adalah jumlah dari semua file data database.
Indeks :Jumlah ruang yang digunakan oleh indeks.
Catatan:Dalam beberapa kasus, saya telah melihat bahwa ukuran ukuran indeks lebih besar dari ukuran data sebenarnya. Sejauh menyangkut indeks, apa yang dibutuhkan untuk sistem selalu bergantung pada kinerja database. Sering kali, operasi baca lebih penting daripada operasi tulis. Dan dalam beberapa kasus lain, menulis lebih penting daripada membaca. Dalam kasus di mana bisnis telah memutuskan bahwa membaca jauh lebih penting daripada menulis, sistem itu mungkin membutuhkan banyak indeks untuk memenuhi persyaratan kinerja bisnis dan pengguna.
Tidak terpakai :Sebagian dari ruang yang dipesan, yang belum digunakan
Tidak digunakan adalah halaman pada luasan yang dialokasikan tetapi belum digunakan oleh objek apa pun. Segera setelah suatu tingkat dialokasikan (baik sebagai seragam atau tingkat bersama), kami mendapatkan delapan halaman yang dipesan pada tingkat itu. Beberapa halaman digunakan, dan beberapa tidak digunakan.
tidak terpakai dan tidak terisi kolom dalam output mungkin membingungkan. Untuk memperjelas, tidak terpakai keluaran kolom tidak menunjukkan jumlah ruang kosong yang tersisa di seluruh basis data. Sebaliknya, ini adalah jumlah total ruang yang disediakan untuk tabel tetapi tidak diisi dengan data. Dalam banyak kasus, ruang yang tidak terpakai dapat diperoleh kembali dengan membuat indeks berkerumun atau mengelola indeks yang ada.
Output dari sp_spaceused selanjutnya dapat disederhanakan untuk menemukan ukuran file .mdf dan file .log. Jumlah ruang yang dicadangkan dan ruang yang tidak terisi kurang lebih sama dengan ukuran file data—atau MDF. Selain itu, mengurangkan ukuran file MDF dari ukuran database akan menghasilkan ukuran file log.
Jadi di sini ada dua rumus:
Ukuran file MDF =cadangan + ruang yang tidak terisi
Ukuran file log =Database_Size – Ukuran file MDF
SELECT 476704+ 1280+ 1312 'Reserved KB', (479296/1024.00)+51.94 'MDFSizeMB', 848.00 - ((479296/1024.00)+51.94) 'LogSizeMB'
Poin-poin di atas memberi tahu kita bagaimana setiap kolom dalam output sp_spaceused diinterpretasikan, dihitung, dan dianalisis.
Dampak setelan pertumbuhan otomatis
Ukuran awal dan konfigurasi pertumbuhan otomatis memiliki efek signifikan pada ruang yang tidak digunakan. Menetapkan nilai yang tepat untuk ini adalah sebuah tantangan. Saya telah melihat banyak kasus di mana pertumbuhan otomatis ditetapkan untuk tumbuh dalam persentase. Mari kita asumsikan bahwa pertumbuhan otomatis ditetapkan pada 25% untuk ukuran file data 100 GB. Hanya dibutuhkan 4 peristiwa pertumbuhan otomatis untuk mengisi disk drive.
Kasus lainnya adalah membangun kembali indeks. Operasi ini memiliki dampak langsung pada ruang tabel yang tidak digunakan, karena data diacak antara luasan seragam dan campuran. Dalam beberapa kasus, saat mengacak halaman, operasi dapat menyebabkan ruang yang tidak terisi karena pengaturan pertumbuhan otomatis dari file data.
Mari kita pertimbangkan skenario di mana pengaturan pertumbuhan otomatis tidak diatur dengan benar di database. Ini lagi-lagi menjadi masalah:Jika pertumbuhan otomatis diaktifkan di database, itu berarti ekspansi drive terjadi secara otomatis selama beberapa peristiwa meskipun data tidak menggunakan semua ruang.
Itu selalu merupakan praktik yang baik untuk mengatur pengaturan pertumbuhan otomatis yang sesuai untuk file data. Terkadang, pengaturan file data yang salah dapat menyebabkan fragmentasi fisik, yang mengakibatkan penurunan kinerja sistem yang parah. Dengan kata lain, jika Anda tidak memiliki ruang yang tidak terisi, data baru akan mencoba untuk duduk di lokasi kosong yang mungkin tersebar. Ini berlaku untuk file log juga. Ruang yang tidak terisi dalam database secara tidak langsung mempengaruhi pengaturan pertumbuhan otomatis dari file data dan file log dan secara langsung mempengaruhi kinerja. Kuncinya adalah menemukan keseimbangan yang tepat.
Menutup
- Dalam proses pembuatan database, ukuran yang ditentukan (yaitu ukuran awal) tidak lain adalah ukuran sebenarnya dari database. Ukuran awal ini dicatat di Header Halaman. Selama proses penyusutan basis data, proses menggunakan ukuran minimum properti sebagai referensi, hanya jika ukuran data aktual kurang dari ukuran minimum — ukuran minimum juga ditemukan di Header Halaman, dan dapat dilihat menggunakan perintah DBCC PAGE. Selain itu, proses yang sama juga berlaku untuk DBCC SHRINKFILE, yang mengecilkan file hingga kurang dari ukuran awalnya.
- Ini bukanlah praktik yang disarankan untuk mengecilkan database untuk mengosongkan ruang drive, meskipun, keputusannya bergantung pada skenario—skenario yang tidak biasa mungkin memerlukan tindakan yang tidak konvensional. Namun, kita harus ingat bahwa menyusutkan database menyebabkan fragmentasi dalam database. Itu selalu merupakan praktik yang baik untuk menganalisis akar penyebab ruang yang tidak terisi dan ruang yang tidak terpakai dari objek. Dalam banyak kasus, memperluas disk untuk menangani pertumbuhan data akan menjadi opsi yang layak/disarankan.
- Konfigurasi pertumbuhan otomatis:Ketika SQL Server melakukan operasi pertumbuhan otomatis, transaksi yang memicu peristiwa pertumbuhan otomatis harus menunggu hingga peristiwa pertumbuhan otomatis selesai. Hanya dengan begitu transaksi itu sendiri dapat selesai.
- Selalu disarankan untuk menyetel opsi pertumbuhan otomatis dalam angka, bukan persentase.
- Induksi ruang yang tidak terpakai dalam tabel bisa jadi karena alasan berikut:
- Fragmentasi
Ketika data terfragmentasi karena sifat dan jenis definisinya, beberapa ruang yang tidak digunakan akan dihasilkan. Selain itu, seringnya modifikasi data (Semua operasi UPDATE, INSERT, ATAU DELETE) menyebabkan lebih banyak jumlah pemisahan halaman, yang kemungkinan besar akan menghasilkan ruang yang tidak digunakan dalam tabel. - Tidak ada indeks berkerumun di atas tabel
Untuk mengurangi fragmentasi di Heap, orang dapat memikirkan untuk membuat indeks berkerumun di atas meja. Untuk mengurangi fragmentasi indeks, lakukan pemeliharaan indeks dengan menentukan nilai avg_fragmentation_in_percent. - Ukuran data
Dalam beberapa kasus, menggunakan Tipe Data yang sesuai menghasilkan baris data yang lebih kecil yang pada gilirannya memungkinkan penempatan lebih banyak baris dalam satu halaman. Ini tidak hanya mengurangi ruang internal yang tidak terpakai tetapi juga berdampak pada kinerja dengan mengurangi jumlah pemisahan halaman.
- Fragmentasi
- Ruang yang tidak terpakai mungkin juga merupakan hasil dari penghapusan kolom panjang variabel. Gunakan DBCC CLEANTABLE setelah Anda membuat perubahan signifikan pada kolom panjang variabel dalam tabel atau tampilan terindeks untuk segera mendapatkan kembali ruang yang tidak digunakan. Atau, Anda dapat membangun kembali indeks pada tabel atau tampilan; namun, ini adalah operasi yang lebih intensif sumber daya.
- Ruang yang tidak terpakai relatif lebih besar ketika kita memuat data yang relatif lebih besar (>8 KB). Dalam kasus seperti itu, kami berakhir dengan sejumlah besar ruang yang tidak terpakai pada halaman data.
- Setelah Migrasi SharePoint, seseorang dapat melihat sejumlah besar ruang yang tidak digunakan yang diperkenalkan di database. Reklamasi adalah proses yang lebih lambat, proses pembersihan hantu menghapus halaman ini dan pembebasan terjadi selama jangka waktu tertentu.
- Dalam beberapa kasus, nilai sp_spaceused mungkin tidak benar. Meskipun sp_spaceused mendapatkan informasinya dari objek sistem yang menyimpan semua perkiraan, kadang-kadang bisa tidak akurat. Salah satu alasan untuk ini adalah bahwa selama migrasi database, atau dalam kasus statistik usang, atau ketika sistem sering mengalami modifikasi DDL, atau setelah melakukan operasi penyalinan massal yang besar. Untuk menyinkronkan objek sistem, gunakan pernyataan DBCC updateusage(0) atau DBCC CHECKTABLE untuk memastikan bahwa sp_spaceused mengembalikan data akurat terkini. Namun, ingat bahwa perintah DBCC membutuhkan banyak sumber daya; memiliki pemahaman yang baik tentang implikasi penggunaannya. Saat kita menjalankan perintah DBCC updateusage, SQL Server Database Engine memindai halaman data dalam database dan membuat koreksi yang diperlukan untuk sys.allocation_units dan sys.partitions tampilan katalog mengenai ruang penyimpanan yang digunakan oleh setiap tabel.
Referensi
- https://msdn.microsoft.com/en-us/library/cc280360.aspx
- https://docs.microsoft.com/en-us/sql/t-sql/database-console-commands/dbcc-cleantable-transact-sql
- https://docs.microsoft.com/en-us/sql/relational-databases/system-catalog-views/sys-database-files-transact-sql