ในการประมาณขนาดของคุณคุณได้คำนึงถึงจำนวนเนื้อที่ที่ดัชนีใช้หรือไม่ นอกจากนี้หากคุณมีฟิลด์ข้อความที่ตั้งค่าเป็นหลายไบต์ ( N[VAR]CHAR
แทน[VAR]CHAR
) และไฟล์อินพุตเป็น UTF-8 หรือธรรมดาหนึ่งไบต์ต่อตัวอักษรจากนั้นจะผลักดันความต้องการพื้นที่เก็บข้อมูลของคุณมากถึงสองเท่า นอกจากนี้โปรดจำไว้ว่าหากคุณมีคีย์ / ดัชนีคลัสเตอร์ในตารางขนาดของสิ่งนี้จะส่งผลกระทบต่อดัชนีอื่น ๆ ทั้งหมดในตารางเพราะพวกเขารวมถึงค่าคีย์คลัสเตอร์สำหรับทุกแถว(เพื่อให้เป็นตัวอย่างที่รุนแรงหากตารางมี NCHAR (10) ) ที่สำคัญที่เป็น int จะทำและที่เป็นกุญแจสำคัญคลัสเตอร์ของคุณ / ดัชนีคุณไม่ได้เป็นเพียงการใช้เป็นพิเศษ 16 ไบต์ต่อแถวในหน้าข้อมูลที่คุณยังเสีย 16 ไบต์ต่อแถวในทุกดัชนีอื่น ๆ ในตารางที่ )
นอกจากนี้จะมีการจัดสรรพื้นที่บางส่วน แต่ไม่ได้ใช้เช่นกันเนื่องจากเอ็นจิ้น DB ได้จัดสรรพื้นที่บางส่วนหลังจากลบเพื่อให้สามารถใช้อีกครั้งได้อย่างรวดเร็วสำหรับข้อมูลใหม่ในตารางนั้นหรือเนื่องจากรูปแบบของการแทรกและการลบได้ทิ้งไว้หลายหน้าเท่านั้น เต็ม.
คุณสามารถเรียกใช้:
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
เพื่อดูอย่างรวดเร็วว่าตารางกำลังใช้พื้นที่อะไร
นอกจากนี้ยังEXEC sp_spaceused
ทำงานอยู่ภายในฐานข้อมูลที่จะกลับมาสองชุดผลลัพธ์ รายการแรกแสดงพื้นที่ทั้งหมดที่จัดสรรในระบบไฟล์สำหรับไฟล์ข้อมูลและจำนวนที่ไม่ได้ถูกจัดสรรส่วนที่สองแสดงจำนวนพื้นที่ที่จัดสรรไว้ที่ใช้สำหรับหน้าข้อมูลสำหรับหน้าดัชนีหรือไม่ได้ใช้งานในปัจจุบัน
sp_spaceused
จะคืนพื้นที่ที่ใช้โดยวัตถุที่กำหนดด้วยดังนั้นคุณสามารถวนซ้ำเพื่อสร้างตารางสำหรับการวิเคราะห์:
-- 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
รหัสด้านบนจะแสดงผลทุกขนาดตารางในหนึ่งรายการรวมทั้งแถวเดี่ยวสำหรับผลรวม หากจำเป็นคุณสามารถใช้มุมมองระบบต่าง ๆ (เช่นsys.objects
และsys.dm_db_partition_stats
ใช้ในแบบสอบถามแรกด้านบนดูhttp://technet.microsoft.com/en-us/library/ms177862.aspxสำหรับรายละเอียดเพิ่มเติม) เพื่อรับรายละเอียดเพิ่มเติมเช่น พื้นที่ที่ใช้โดยแต่ละดัชนี
พื้นที่ว่างที่ไม่ได้ใช้มีสามคลาสในไฟล์ข้อมูล:
- สิ่งที่ไม่ได้ถูกจัดสรรให้กับสิ่งใด ๆ (สิ่งนี้แสดงใน resultset แรกจากที่
sp_spaceused
ไม่มีวัตถุที่ระบุ)
- สิ่งที่ถูกจัดสรรให้กับวัตถุ (สงวนไว้) แต่ไม่ได้ใช้งานในปัจจุบัน (สิ่งนี้จะแสดงในการนับ "ไม่ได้ใช้" ใน
sp_spaceused
เอาต์พุตของ
- ที่ถูกล็อคในหน้าที่ใช้งานบางส่วน (สิ่งนี้จะดูเหมือนว่าจะถูกนำมาใช้เนื่องจากทุกอย่างถูกจัดสรรในส่วนของหน้าเดียวหนึ่งหน้ายาว 8,192 ไบต์) นี่เป็นการยากที่จะตรวจจับ / คำนวณ มันเกิดจากการผสมผสานของสองปัจจัย:
- แยกหน้า เมื่อข้อมูลถูกเพิ่มเข้ามาคุณมักจะจบลงด้วยหน้าว่างบางส่วน (เครื่องมือจัดเก็บข้อมูลสามารถทำให้เนื้อหาหน้าเว็บเป็นปกติได้ แต่จะไม่มีประสิทธิภาพมาก) และในขณะที่แถวถูกลบเนื้อหาของหน้าจะไม่ถูกบรรจุโดยอัตโนมัติ I / O โหลดโดยทั่วไปให้ห่างไกลจากมันคุ้มค่า)
- เอ็นจิ้นการจัดเก็บจะไม่แยกแถวเป็นหน้า ๆ หลาย ๆ หน้า (ขนาดนี้มาพร้อมกับขนาดหน้ากระดาษที่มาจากวงเงิน 8,192 ไบต์ต่อแถว) หากแถวของคุณมีขนาดคงที่และใช้เวลา 1,100 ไบต์คุณจะต้อง "เสีย" อย่างน้อย 492 ไบต์ของแต่ละบล็อกข้อมูลที่จัดสรรให้กับตารางนั้น (7 แถวรับ 7,700 ไบต์และ 8 จะไม่พอดีดังนั้นจำนวนไบต์ที่เหลือจะชนะ ' ไม่ใช้) ยิ่งแถวกว้างเท่าไหร่ก็ยิ่งแย่ลงเท่านั้น ตาราง / ดัชนีที่มีแถวความยาวแปรผัน (ซึ่งเป็นเรื่องธรรมดามากกว่าความยาวคงที่อย่างสมบูรณ์) โดยทั่วไปจะยุติธรรมดีกว่า (แต่ไม่ง่ายในการคำนวณเรื่อง)
ข้อแม้อื่นที่นี่คือวัตถุขนาดใหญ่ ( TEXT
คอลัมน์[N]VARCHAR(MAX)
ค่าที่สูงกว่าขนาดที่กำหนดและอื่น ๆ ) ขณะที่วางตำแหน่งไว้นอกหน้าเพียงแค่ 8 ไบต์ในข้อมูลแถวหลักเพื่อเก็บตัวชี้ไปยังข้อมูลที่อื่น) เพื่อให้สามารถทำลายขีด จำกัด 8,192 ไบต์ต่อแถว
tl; dr:การประมาณขนาดฐานข้อมูลที่คาดไว้อาจมีส่วนเกี่ยวข้องมากกว่าที่เป็นอยู่ในตอนแรก