Constraint (Bài trước)

Kiểm tra kích thước, nơi lưu file dữ liệu và log của CSDL SQL Server

Mỗi Database trong SQL Server có một định danh database_id trong sys.master_files, mỗi Database có các file dữ liệu và file log. Truy vấn sau sẽ hiện thị kích thước (MB) của các file này, cũng như nơi lưu trữ file này trên ổ đĩa

Trong truy vấn có thiết lập lọc database_id > 4 để không thống kế các Database hệ thống. Ngoài ra nếu muốn truy vấn đến một CSDL cụ thể bạn tự cho vào lọc theo database_id hoặc database_name ở mệnh đề where.

select database_id as db_id,
    DB_NAME(database_id) as db_name,
    type_desc,
    name as [FileName],
    physical_name as [File Path],
    CAST(ROUND(size/128.0, 2) as numeric(36,2))  as [Size (MB)]
from sys.master_files
where type in (0,1) and database_id > 4
order by database_id
Kết quả truy vấn xem kích thước file dữ liệu và log

Kiểm tra kích thước của các bảng trong CSDL SQL Server

Câu truy vấn sau hiện hiện thị thông tin thống kê về kích thước của các bảng biểu trong cơ sở dữ liệu.

Giả sử kiểm tra CSDL có tên là webdb, thì nó liệt kê tất cả các bảng của CSDL, mỗi bảng có bao nhiêu dòng dữ liệu, bảng đó chiếm bao nhiêu dung lượng (không gian lưu trữ được cấp phát)

use webdb;

select
    t.NAME as [Table],
    p.rows,
    CAST(ROUND(((SUM(a.total_pages) * 8) / 1024.00), 2) as numeric(36, 2)) as [Total Space (MB)],
    CAST(ROUND(((SUM(a.used_pages) * 8) / 1024.00), 2) as numeric(36, 2)) as [Used Space(MB)],
    CAST(ROUND(((SUM(a.total_pages) - SUM(a.used_pages)) * 8) / 1024.00, 2) as numeric(36, 2)) as [Unused Space (MB)]
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
    [Total Space (MB)] DESC, t.Name
Kết quả truy vấn thống kê kích thước các bảng

Sử dụng SHRINKDATABASE và SHRINKFILE thu nhỏ kích thước file Database

Khi Database hoạt động, file dữ liệu và file log có thể có dung lượng lớn hơn dữ liệu thực nó chiếm dữ (như cấp trước dung lượng dự trữ) hoặc không thu hồi dữ liệu xóa ... Để giảm dung lượng có thể dùng chỉ thị DBCC SHRINKDATABASE

DBCC SHRINKDATABASE cố gắng thu gọn dung lượng file dữ liệu và file log của một database cụ thể.

Cú pháp:

DBCC SHRINKDATABASE(database_name, target_percent)
  • database_name tên cơ sơ dữ liệu muốn thu gọn dung lượng
  • target_percent để lại phần trăm dung lượng dự trữ sau thu gọn, như 5%, 10%

Ví dụ, thu gọn log và data cho Database có tên shopdata, với mục tiêu để lại 5% dung lượng dự trữ, thực hiện truy vấn T-SQL sau

USE shopdata;

ALTER DATABASE shopdata SET RECOVERY SIMPLE
GO

DBCC SHRINKDATABASE(shopdata,5)
GO

ALTER DATABASE shopdata SET RECOVERY FULL
GO

Trong T-SQL trên có đoạn chuyển Recovery Model sang SIMPLE trước khi SHRINKDATABASE, để biết thêm xem: backup và restore database trong SQL Server

Thu gọn LOG

Đối với log file, bạn có thể sử dụng SHRINKFILE để thu gọn về một kích thước mục tiêu, ví dụ database shopdata có file log là shopdata_log, để thu gọn bạn chạy

use shopdata;
ALTER DATABASE shopdata SET RECOVERY SIMPLE;
GO
DBCC SHRINKFILE(N'shopdata_log', 1)
GO
ALTER DATABASE shopdata SET RECOVERY FULL;
GO

Kiểm tra các query đang chạy trên SQL Server

Với Database lớn, thực hiện thu gọn có khi mất thời gian dài, để kiểm tra xem các query còn đang chạy thì thực hiện

SELECT  *
FROM    sys.dm_exec_requests
        CROSS APPLY sys.dm_exec_sql_text(sql_handle)
Constraint (Bài trước)