Boyut tahminlerinizde, dizinlerin aldığı alan miktarını dikkate aldınız mı? Ayrıca, çok baytlı ( N[VAR]CHAR
yerine [VAR]CHAR
) olarak ayarlanmış metin alanlarınız varsa ve girdi dosyaları UTF-8 veya karakter başına düz bir baytsa, depolama gereksinimlerinizi iki katına kadar yükseltir. Ayrıca, bir tabloda kümelenmiş bir anahtar / dizin varsa, bunun boyutu, her satır için kümelenmiş anahtar değerini içerdiğinden, tablodaki diğer tüm dizinleri etkilediğini unutmayın (bir tablonun bir NCHAR ( ) INT'nin yapacağınız anahtar ve kümelenmiş anahtarınız / dizininiz bu veri sayfalarında yalnızca satır başına fazladan 16 bayt kullanmazsınız, ayrıca bu tablodaki diğer tüm dizinlerde satır başına 16 bayt harcarsınız ) .
Ayrıca, DB motoru silindikten sonra ayrılan bir alan bıraktığından, bu tablodaki yeni veriler için tekrar hızlı bir şekilde kullanılabilmesi için veya ekleme ve silme kalıbının yalnızca birçok sayfa bırakması nedeniyle bir miktar alan ayrılır ancak kullanılmaz. tam.
Koşabilirsin:
SELECT o.name
, SUM(ps.reserved_page_count)/128.0 AS ReservedMB
, SUM(ps.used_page_count)/128.0 AS UsedMB
, SUM(ps.reserved_page_count-ps.used_page_count)/128.0 AS DiffMB
FROM sys.objects o
JOIN sys.dm_db_partition_stats ps ON o.object_id = ps.object_id
WHERE OBJECTPROPERTYEX(o.object_id, 'IsMSShipped') = 0
GROUP BY o.name
ORDER BY SUM(ps.reserved_page_count) DESC
hangi tabloların yer kapladığına hızlı bir bakış.
Ayrıca EXEC sp_spaceused
bu DB içinde çalıştırmak iki sonuç kümesi döndürür. Birincisi, veri dosyaları için dosya sisteminde ayrılan toplam alanı ve bunun ne kadarının ayrılmamış olduğunu, ikincisi ise tahsis edilen alanın ne kadarının veri sayfaları, dizin sayfaları için kullanıldığını veya şu anda kullanılmamış olduğunu listeler.
sp_spaceused
belirli bir nesne tarafından kullanılan alanı da döndürür, böylece analiz için bir tablo oluşturmak üzere bunu döngüye alabilirsiniz:
-- TEMP TABLES FOR ANALYSIS
CREATE TABLE #tTables (sName NVARCHAR(MAX), iRows BIGINT, iReservedKB BIGINT, iDataKB BIGINT, iIndexKB BIGINT, iUnusedKB BIGINT)
CREATE TABLE #tTmp (sName NVARCHAR(MAX), iRows BIGINT, sReservedKB NVARCHAR(MAX), sDataKB NVARCHAR(MAX), sIndexKB NVARCHAR(MAX), sUnusedKB NVARCHAR(MAX))
-- COLLECT SPACE USE PER TABLE
EXEC sp_msforeachtable 'INSERT #tTmp EXEC sp_spaceused [?];'
-- CONVERT NUMBER-AS-TEXT COLUMNS TO NUMBER TYPES FOR EASIER ANALYSIS
INSERT #tTables SELECT sName, iRows
, CAST(REPLACE(sReservedKB, ' KB', '') AS BIGINT)
, CAST(REPLACE(sDataKB , ' KB', '') AS BIGINT)
, CAST(REPLACE(sIndexKB , ' KB', '') AS BIGINT)
, CAST(REPLACE(sUnusedKB , ' KB', '') AS BIGINT)
FROM #tTmp
DROP TABLE #tTmp
-- DO SOME ANALYSIS
SELECT sName='TOTALS', iRows=SUM(iRows), iReservedKB=SUM(iReservedKB), iDataKB=SUM(iDataKB), iIndexKB=SUM(iIndexKB), iUnusedKB=SUM(iUnusedKB) FROM #tTables ORDER BY sName
SELECT * FROM #tTables ORDER BY iReservedKB DESC
-- CLEAN UP
DROP TABLE #tTables
Yukarıdaki kod, tüm tablo boyutlarını tek bir listede ve toplamlar için tek bir satır çıkarır. Gerekirse Eğer (gibi çeşitli sistem görünümleri kullanabilirsiniz sys.objects
ve sys.dm_db_partition_stats
yukarıdaki ilk sorguda kullanılan bakınız http://technet.microsoft.com/en-us/library/ms177862.aspx gibi daha fazla ayrıntı almak için çok daha fazla detay için) her bir dizin tarafından kullanılan alan.
Bir veri dosyasında üç kullanılmayan alan sınıfı vardır:
- Hiçbir şeye tahsis edilmeyen (bu, ilk sonuç kümesinde
sp_spaceused
hiçbir nesne belirtilmemiş olarak gösterilir)
- Bir nesneye tahsis edilen (ayrılmış) ancak şu anda kullanılmayan (
sp_spaceused
çıkıştaki "kullanılmayan" sayımda gösterilir) .
- Kısmen kullanılan sayfalarda kilitli olan (her şey tek sayfa yığınlarına ayrıldığı için kullanılacak gibi görünecektir, bir sayfa 8.192 bayt uzunluğundadır). Bunu tespit etmek / hesaplamak daha zordur. İki faktörün bir karışımı nedeniyle:
- Sayfaları böl. Veri ekledi alır gibi sık sık bölümü boş sayfa (depolama motoru ile bitirmek olabilir hep normalleştirmek sayfa içerikleri, ama bu çok verimsiz olur) ve satırlar silinir sayfa içeriği otomatik tekrar olabilecekleri (paketlenmiş, ama ekstra değildir I / o yükü genellikle uzak değerinde o) den.
- Depolama motoru bir satırı birden fazla sayfaya bölemez (bu, satır başına 8.192 bayt sınırının geldiği sayfa boyutu ile birlikte). Satırlarınız sabit büyüklükte ve her biri 1,100 bayt alırsa, o tabloya tahsis edilen her veri bloğunun en az 492 baytını "harcayacaksınız" (7 satır 7,700 bayt alır ve 8'inci sığmaz, böylece kalan baytlar kazanır ' t kullanılabilir). Satırlar ne kadar geniş olursa, o kadar kötü olabilir. Değişken uzunluktaki satırlara (tamamen sabit uzunluklu olanlardan çok daha yaygın olan) sahip tablolar / dizinler genellikle daha iyidir (ancak konuyu hesaplamak daha az kolaydır).
Buradaki başka bir uyarı büyük nesnelerdir ( TEXT
sütunlar,[N]VARCHAR(MAX)
belirli bir boyutun üzerindeki değerler vb.) sayfa dışına yerleştirildiklerinde, başka bir yerde verilere bir işaretçi tutmak için ana satır verilerinde 8 bayt alır), böylece satır başına 8,192 bayt sınırını kırabilir.
tl; dr: Beklenen veritabanı boyutlarının tahmin edilmesi, başlangıçta varsayılması doğal olandan çok daha fazla olabilir.