หลังจากช่วยได้ นอกจากเป็น Dev แล้ว อีกอย่างที่ Dev ควรรู้ด้วย คือ ตัว Database ครับ วันนี้ผมขอแปะ Query สำหรับดูขนาดของ Database ไฟล์ .mdf กับ .ldf โดยสามารถดูข้อมูลจากได้ Query ดังนี้ัครับ
Table of Contents
Database File Size
SELECT LOGICALNAME = DBF.NAME , FILETYPE = DBF.TYPE_DESC , FILEGROUPNAME = FG.NAME , PHYSICALFILELOCATION = DBF.PHYSICAL_NAME , FILESIZEMB = CONVERT(DECIMAL(10,2),DBF.SIZE/128.0) , USEDSPACEMB = CONVERT(DECIMAL(10,2),DBF.SIZE/128.0 - ((DBF.SIZE/128.0) - CAST(FILEPROPERTY(DBF.NAME, 'SPACEUSED') AS INT)/128.0)) , FREESPACEMB = CONVERT(DECIMAL(10,2),DBF.SIZE/128.0 - CAST(FILEPROPERTY(DBF.NAME, 'SPACEUSED') AS INT)/128.0) FROM SYS.DATABASE_FILES DBF LEFT JOIN SYS.FILEGROUPS FG ON DBF.DATA_SPACE_ID = FG.DATA_SPACE_ID ORDER BY DBF.TYPE DESC, DBF.NAME;
ผลลัพธ์ที่ได้

Table Size
SELECT t.NAME AS TableName, s.Name AS SchemaName, p.rows AS RowCounts, SUM(a.total_pages) * 8 AS TotalSpaceKB, CAST(ROUND(((SUM(a.total_pages) * 8) / 1024.00), 2) AS NUMERIC(36, 2)) AS TotalSpaceMB, SUM(a.used_pages) * 8 AS UsedSpaceKB, CAST(ROUND(((SUM(a.used_pages) * 8) / 1024.00), 2) AS NUMERIC(36, 2)) AS UsedSpaceMB, (SUM(a.total_pages) - SUM(a.used_pages)) * 8 AS UnusedSpaceKB, CAST(ROUND(((SUM(a.total_pages) - SUM(a.used_pages)) * 8) / 1024.00, 2) AS NUMERIC(36, 2)) AS UnusedSpaceMB FROM sys.tables t INNER JOIN sys.indexes i ON t.OBJECT_ID = i.object_id INNER JOIN sys.partitions p ON i.object_id = p.OBJECT_ID AND i.index_id = p.index_id INNER JOIN sys.allocation_units a ON p.partition_id = a.container_id LEFT OUTER JOIN sys.schemas s ON t.schema_id = s.schema_id WHERE t.NAME NOT LIKE 'dt%' AND t.is_ms_shipped = 0 AND i.OBJECT_ID > 255 GROUP BY t.Name, s.Name, p.Rows ORDER BY UsedSpaceMB DESC, t.Name;
ประโยชน์
- เอาไว้สำหรับสร้างแผนการทำ Maintance ระบบ
- เอาไว้สำหรับตัดสินใจการ Shink DB
แถม
ถ้าเราต้องการจะลด Database Size หลังจากรู้ Size Database แล้ว ทั้งในาส่วน mdf / ldf ถ้าต้องการลด Database Size ตัวเนื่อ DB นะ ลองทำตาม Step ประมาณนี้ได้
- คุยกันก่อนว่าจะลบ
- ลบข้อมูลจาก table ที่มันบวมๆ เวลาลบแนะนำให้ใช้คำสั่ง TRUNCATE มันเร็ว และไม่เพิ่ม Transaction Log ด้วย
TRUNCATE TABLE <YOUR_TABLE_NAME>
การลบข้อมูล ข้อมูลหลายจริง แต่พื้นที่มันยังจะไม่คืนนะ ต้อ
- ดูเลข id ของ db file
SELECT FILE_ID, NAME FROM SYS.DATABASE_FILES
- ลดขนาดเนื่อไฟล์จริงๆด้วยคำสั่ง
- โดยที่ 1 คือ FILE_ID จากคำสั่งก่อหน้า
- TRUNCATEONLY - บอก shrink เฉพาะส่วนที่ว่างท้ายไฟล์ (ไม่จัดเรียงข้อมูลใหม่)
DBCC SHRINKFILE (1, TRUNCATEONLY);
การ shrink บ่อยๆ อาจกระทบประสิทธิภาพและ fragmentation
และก็คำสั่ง DBCC SHRINKFILE มีคู่มือเต็มๆลองไปอ่านกันได้ https://learn.microsoft.com/en-us/sql/t-sql/database-console-commands/dbcc-shrinkfile-transact-sql
ปล. จริงๆแล้ว SHRINKFILE กดจาก GUI ใน SSMS ก็ได้นะ
แต่ส่วนใหญ่ที่เจอ จะพบ log บวมมากกว่า สามารถไปอ่านได้จากอีก Blog ได้เลยครับ ส่วน DB2 ตามมา Blog แปะไว้ด้านล่างเรียบร้อย
Discover more from naiwaen@DebuggingSoft
Subscribe to get the latest posts sent to your email.