หลังจากช่วยได้ นอกจากเป็น 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.



