ขนาดฐานข้อมูล - MDF ใหญ่เกินไป?


10

ฉันกำลังบำรุงรักษาฐานข้อมูล SQL Server 2005 ซึ่งโฮสต์ประมาณ 2.9Tb ของข้อมูล (2 x 1.45Tb - ฉันมี schema RAW และ schema การวิเคราะห์ดังนั้นโดยทั่วไปแล้วสองชุดของข้อมูลที่ติดเครื่อง) รูปแบบการกู้คืนง่ายและ.ldfอยู่ที่ 6Gb

ไม่ว่าจะด้วยเหตุผลใดก็ตาม.mdfคือ 7.5Tb ตอนนี้อาจมีคอลัมน์เพิ่มเติมเพียง 2-3 คอลัมน์ในตารางวิเคราะห์และมีNVARCHAR(MAX)คอลัมน์ไม่มากซึ่งจากสิ่งที่ฉัน (อาจเข้าใจผิด - โปรดแก้ไขให้ถูกต้องถ้าฉันผิด) อาจทำให้เกิดการจัดสรรพื้นที่เพิ่มเติม หลังจากหดฐานข้อมูลตอนนี้ - มันอยู่ที่ ~ 9Tb ก่อนหน้านั้น ความคิดใด ๆ

และโปรดแจ้งให้เราทราบหากคุณมีคำถามเพิ่มเติม - ฉันยังใหม่ต่อการดูแลฐานข้อมูลและการเพิ่มประสิทธิภาพ (โดยปกติฉันจะไม่ทำงานด้านนี้ :))

ขอบคุณมาก!

Andrija


ขอบคุณ Marc - วิธีใดก็ตามที่ฉันสามารถย้ายคำถามนี้ไปที่นั่นหรือฉันต้องโพสต์ใหม่?

ไชโย - อย่างที่คุณคงเดาได้ฉันใหม่ที่นี่ :)

คำตอบ:


11

ในการประมาณขนาดของคุณคุณได้คำนึงถึงจำนวนเนื้อที่ที่ดัชนีใช้หรือไม่ นอกจากนี้หากคุณมีฟิลด์ข้อความที่ตั้งค่าเป็นหลายไบต์ ( 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สำหรับรายละเอียดเพิ่มเติม) เพื่อรับรายละเอียดเพิ่มเติมเช่น พื้นที่ที่ใช้โดยแต่ละดัชนี


พื้นที่ว่างที่ไม่ได้ใช้มีสามคลาสในไฟล์ข้อมูล:

  1. สิ่งที่ไม่ได้ถูกจัดสรรให้กับสิ่งใด ๆ (สิ่งนี้แสดงใน resultset แรกจากที่sp_spaceusedไม่มีวัตถุที่ระบุ)
  2. สิ่งที่ถูกจัดสรรให้กับวัตถุ (สงวนไว้) แต่ไม่ได้ใช้งานในปัจจุบัน (สิ่งนี้จะแสดงในการนับ "ไม่ได้ใช้" ในsp_spaceusedเอาต์พุตของ
  3. ที่ถูกล็อคในหน้าที่ใช้งานบางส่วน (สิ่งนี้จะดูเหมือนว่าจะถูกนำมาใช้เนื่องจากทุกอย่างถูกจัดสรรในส่วนของหน้าเดียวหนึ่งหน้ายาว 8,192 ไบต์) นี่เป็นการยากที่จะตรวจจับ / คำนวณ มันเกิดจากการผสมผสานของสองปัจจัย:
    • แยกหน้า เมื่อข้อมูลถูกเพิ่มเข้ามาคุณมักจะจบลงด้วยหน้าว่างบางส่วน (เครื่องมือจัดเก็บข้อมูลสามารถทำให้เนื้อหาหน้าเว็บเป็นปกติได้ แต่จะไม่มีประสิทธิภาพมาก) และในขณะที่แถวถูกลบเนื้อหาของหน้าจะไม่ถูกบรรจุโดยอัตโนมัติ I / O โหลดโดยทั่วไปให้ห่างไกลจากมันคุ้มค่า)
    • เอ็นจิ้นการจัดเก็บจะไม่แยกแถวเป็นหน้า ๆ หลาย ๆ หน้า (ขนาดนี้มาพร้อมกับขนาดหน้ากระดาษที่มาจากวงเงิน 8,192 ไบต์ต่อแถว) หากแถวของคุณมีขนาดคงที่และใช้เวลา 1,100 ไบต์คุณจะต้อง "เสีย" อย่างน้อย 492 ไบต์ของแต่ละบล็อกข้อมูลที่จัดสรรให้กับตารางนั้น (7 แถวรับ 7,700 ไบต์และ 8 จะไม่พอดีดังนั้นจำนวนไบต์ที่เหลือจะชนะ ' ไม่ใช้) ยิ่งแถวกว้างเท่าไหร่ก็ยิ่งแย่ลงเท่านั้น ตาราง / ดัชนีที่มีแถวความยาวแปรผัน (ซึ่งเป็นเรื่องธรรมดามากกว่าความยาวคงที่อย่างสมบูรณ์) โดยทั่วไปจะยุติธรรมดีกว่า (แต่ไม่ง่ายในการคำนวณเรื่อง)
      ข้อแม้อื่นที่นี่คือวัตถุขนาดใหญ่ ( TEXTคอลัมน์[N]VARCHAR(MAX) ค่าที่สูงกว่าขนาดที่กำหนดและอื่น ๆ ) ขณะที่วางตำแหน่งไว้นอกหน้าเพียงแค่ 8 ไบต์ในข้อมูลแถวหลักเพื่อเก็บตัวชี้ไปยังข้อมูลที่อื่น) เพื่อให้สามารถทำลายขีด จำกัด 8,192 ไบต์ต่อแถว

tl; dr:การประมาณขนาดฐานข้อมูลที่คาดไว้อาจมีส่วนเกี่ยวข้องมากกว่าที่เป็นอยู่ในตอนแรก


เดวิด - ขอบคุณมากสำหรับคำตอบอย่างละเอียด! ฉันกำลังวิเคราะห์ฐานข้อมูลในขณะนี้และการตอบสนองของคุณและ Kenneth ได้ช่วยฉันในการทำความเข้าใจกับปัจจัยที่มีผลต่อขนาดฐานข้อมูล ฉันมักจะกังวลเกี่ยวกับประสิทธิภาพ (ทั้งที่เกี่ยวกับการส่งข้อมูลและการใช้ข้อมูล) และข้อมูลที่คุณให้ไว้นั้นมีค่ามาก!
Andrija_Bgd

6

ลองเรียกใช้sp_spaceusedบนฐานข้อมูลของคุณ ตัวอย่างจะคืนค่า:

reserved           data               index_size         unused
------------------ ------------------ ------------------ ------------------
6032 KB            2624 KB            1664 KB            1744 KB

เพื่อให้ทำงานบนฐานข้อมูลเพียงฐานข้อมูลทำงานแล้วUSEsp_spaceused

หากยังคงแสดงพื้นที่ว่างที่ไม่ได้ใช้คุณสามารถลองย่อขนาดอีกครั้งได้ บางครั้งฉันก็พบว่าต้องลองหลายครั้ง บางครั้งฉันก็พบว่าวิธีที่ดีที่สุดในการย่อขนาดไฟล์แต่ละไฟล์แทนที่จะเป็นฐานข้อมูลโดยรวม อย่างไรก็ตามสิ่งที่คุณอาจพบคือคุณมีข้อมูล 2.9Tb และอีก 4 + Tb ของดัชนีในกรณีที่ 7.5TB นั้นค่อนข้างสมเหตุสมผล หากคุณต้องการสัมผัสถึงปริมาณของพื้นที่ (ข้อมูล & ดัชนี) ของแต่ละตารางคุณสามารถเรียกใช้sp_spaceusedที่ระดับโต๊ะได้เช่นกัน คุณสามารถเรียกใช้ได้ทั่วทั้งตารางในฐานข้อมูลโดยใช้คำสั่งต่อไปนี้:

EXEC sp_msforeachtable 'EXEC sp_spaceused [?];'

แม้ว่า sp_msforeachtable คำเตือนที่เป็นธรรมจะไม่มีเอกสาร แต่ไม่ได้รับการสนับสนุนและเป็นที่รู้จักกันว่าพลาดตาราง ในอีกด้านหนึ่งฉันก็มีโชคด้วยตัวเอง

จากข้อมูลทั้งหมดที่กล่าวว่าฐานข้อมูลของคุณควรมีพื้นที่ว่างบางส่วนตามการเติบโตของคุณ โดยทั่วไปคุณต้องการให้แน่ใจว่าคุณมีพื้นที่ว่างสำหรับทุกที่ตั้งแต่ 6 เดือนถึงสองสามปีที่มีมูลค่าการเติบโต นอกจากนี้คุณจะต้องตรวจสอบautogrowthการตั้งค่าของคุณเพื่อให้แน่ใจว่าเหมาะสมกับสถานการณ์ของคุณ autogrowthโดยเฉพาะอย่างยิ่งขนาดของฐานข้อมูลของคุณที่คุณไม่ต้องการที่จะใช้% ใน


ขอบคุณ! ฉันใช้ sp_spaceused และดูเหมือนว่าข้อมูลจริงจะใช้พื้นที่ตามที่ระบุเป็นจำนวนคี่ที่อาจฟังดูเพราะขนาดของไฟล์แบนที่โหลด ... ดัชนีมีขนาดเล็ก (ฉันยัง ' ฉันไม่ได้สร้างสิ่งเพิ่มเติมใด ๆ เนื่องจากพวกเขาจะมีอุปสรรคมากกว่าความช่วยเหลือในกรณีของฉัน) ดังนั้นฉันเดาว่ามันเป็นเพียงตารางจริงที่มีขนาดใหญ่ ... ขอบคุณหนึ่งล้านสำหรับความช่วยเหลือของคุณ!
Andrija_Bgd

ฐานข้อมูลใช้พื้นที่มากกว่าไฟล์แฟล็ต มีค่าใช้จ่ายจำนวนหนึ่งสำหรับโครงสร้างแถวและตารางและจำนวนขยะเนื่องจากโครงสร้างหน้า
Kenneth Fisher

-1

ใช้ SQL Management Studio 1. คลิกขวาที่ฐานข้อมูลจากนั้นคลิกที่ Tasks-> Shrink -> Files

คุณจะเห็นกล่องโต้ตอบที่แสดง: พื้นที่ที่ถูกจัดสรรในปัจจุบัน พื้นที่ว่าง + (% ฟรี)

หาก% ฟรีของคุณมากกว่า 50% คุณอาจลองลดขนาดไฟล์ ฉันเห็นการตีครั้งนี้มากถึง 90% หากฉันตัดสินใจที่จะย่อขนาดไฟล์ฉันมักจะตั้งค่าเป็น 2 หรือ 3 กิ๊กส์มากกว่าพื้นที่ที่จัดสรรปัจจุบัน ฐานข้อมูลส่วนใหญ่ของฉันน้อยกว่า 50gigs ดังนั้นถ้าคุณมีไฟล์ที่ใหญ่กว่าคุณอาจทำให้มันใหญ่ 10 กิ๊ก ฉันมักจะกังวลเกี่ยวกับการลดขนาดถ้าฉันจะย้ายฐานข้อมูลไปยังเซิร์ฟเวอร์อื่นคุณสามารถอ่านทั้งหมดเกี่ยวกับปัญหาการหดตัวในหน้า sql ใด ๆ

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.