2013-02-06 39 views
5

Tôi có cơ sở dữ liệu MS SQL Server 2008 trên một máy chủ chia sẻ và tôi cần phải giảm dung lượng lưu trữ được sử dụng càng nhiều càng tốt. Bảng lớn nhất của tôi có định nghĩa sau:Hàng kích thước trên không

CREATE TABLE [stage](
    [station_id] [smallint] NOT NULL, 
    [time_utc] [smalldatetime] NOT NULL, 
    [stage_mm] [smallint] NOT NULL, 
CONSTRAINT [PK_stage] PRIMARY KEY CLUSTERED ([station_id] ASC,[time_utc] ASC) 

Tôi đã cố gắng tìm ra số byte trung bình trên mỗi bản ghi trong bảng của tôi. Theo lý thuyết, kích thước phải là: 4B (tiêu đề hàng) + 2B (smallint) + 4B (smalldatetime) + 2B (smallint) là 12 byte.

Tuy nhiên, khi tôi chạy lệnh:

dbcc showcontig ('stage') with tableresults 

Nó cho thấy: MinimumRecordSize = 15, MaximumRecordSize = 15 Vì vậy, theo SQL Server, các byte cho mỗi bản ghi là 15 và không 12 Số 15 byte mỗi bản ghi cũng có vẻ chính xác khi tôi xem tổng dung lượng đĩa được thực hiện bởi bảng và chia cho số hàng.

Điều gì đang chiếm thêm 3 byte?

Trả lời

5

3 giá trị bổ sung đó là từ bitmap NULL. According to Paul's post, nó trên mỗi hàng tiết kiệm cho những người có tất cả SPARSE trên các cột (bắt đầu trong SQL Server 2008).

Và theo một dòng trong this BOL post, bitmap NULL là = 2 + ((number_columns_in_clustered_index + 7)/8). Trong trường hợp của bạn, 3.

+0

Cảm ơn bạn đã giải thích. Vì vậy, nó xuất hiện trong trường hợp của tôi nó không thể giảm hàng trên không trong SQL Server 2008 đến ít hơn 7 byte. – jirikadlec2

1

Tôi đồng ý một phần với @Matt, 2 byte là bắt buộc đối với bitmap NULL là chính xác.

Tuy nhiên, byte cuối cùng được tiêu thụ theo số lượng cột trên mỗi bit. Có nghĩa là, nếu tôi có 6 cột trong bảng của tôi sau đó tôi sẽ yêu cầu 1 byte (6-bit), hoặc Nếu tôi có 12 cột sau đó tôi sẽ yêu cầu 2 byte (12-bit).

Trong trường hợp của bạn có 3 cột do đó, nó chỉ lấy 1 byte.

Các vấn đề liên quan