2017-12-21 151 views
13

bảng của tôi bao gồm 3 cộtSQL Server: Ghi kích thước lớn hơn so với dự kiến ​​

| Column Name | Data Type | Size 
| Value  | real  | 4 
| LogId  | int  | 4 
| SigId  | smallint | 2 

Một khóa chính được thiết lập cho các cột LogId, SigId.

Tổng kích thước là 4+4+2=10, tuy nhiên sử dụng sys.dm_db_index_physical_stats Tôi nhận được rằng kích thước bản ghi trung bình (và tối thiểu) trong byte là 25. Ai đó có thể giải thích? Tôi có so sánh táo và cam không?

+0

Cài đặt allow_snapshot_isolation của cơ sở dữ liệu là gì? –

+1

Có thể có liên quan, tôi đã từng có một thư mục các tệp văn bản chiếm ~ 15MB trên đĩa, mặc dù kích thước thực tế của chúng là ~ 500KB, có thể do "* kích thước đơn vị phân bổ *". Có lẽ các con số phản ánh nhiều hơn các bản ghi/cột/bảng/v.v. bạn có. – KtX2SkD

+0

@EdwinStoteler Trạng thái cách ly Ảnh chụp nhanh là 0 – rst

Trả lời

17

Độ dài bản ghi vật lý bao gồm phí trên hàng ngoài không gian cần thiết cho các giá trị cột thực tế. Về trường hợp SQL Server của tôi, tôi nhận được một chiều dài kỷ lục trung bình của 17 báo cáo với bảng sau:

CREATE TABLE dbo.Example1(
     Value real NOT NULL 
    , LogId int NOT NULL 
    , SigId smallint NOT NULL 
    , CONSTRAINT PK_Example1 PRIMARY KEY CLUSTERED(LogId, SigId) 
); 
GO 
INSERT INTO dbo.Example1 (Value, LogId, SigId) VALUES(1, 2, 3); 
GO 
SELECT avg_record_size_in_bytes 
FROM sys.dm_db_index_physical_stats(DB_ID(), OBJECT_ID(N'dbo.Example1'),1,0,'DETAILED') 
WHERE index_level = 0; 
GO 

17 byte kỷ lục dài báo cáo của sys.dm_db_index_physical_stats bao gồm 10 byte dữ liệu, 4 ​​byte cho tiêu đề hồ sơ, 2 byte cho số cột và 1 byte cho bitmap NULL. Xem Paul Randal's Anatomy of a record article để biết chi tiết về cấu trúc bản ghi.

Dưới đây là một kịch bản để đổ người đầu tiên trang clustered index dữ liệu sử dụng DBCC_PAGE được xác định bởi không có giấy tờ (không sử dụng nó trong sản xuất) sys.dm_db_database_page_allocations bảng giá trị chức năng:

DECLARE 
     @database_id int = DB_ID() 
    , @object_id int = OBJECT_ID(N'dbo.Example1') 
    , @allocated_page_file_id int 
    , @allocated_page_page_id int; 
--get first clustered index data page 
SELECT 
     @allocated_page_file_id = allocated_page_file_id 
    , @allocated_page_page_id = allocated_page_page_id 
FROM sys.dm_db_database_page_allocations(@database_id, @object_id, 1, 1, 'DETAILED') 
WHERE 
    page_type_desc = N'DATA_PAGE' 
    AND previous_page_page_id IS NULL --first page of clustered index; 
--dump record 
DBCC TRACEON(3604); 
DBCC PAGE(@database_id,@allocated_page_file_id,@allocated_page_page_id,1); 
DBCC TRACEOFF(3604); 
GO 

Dưới đây là một đoạn trích từ các kết quả trên ví dụ của tôi với các lĩnh vực cấu trúc kỷ lục vật lý gọi:

DATA: 


Slot 0, Offset 0x60, Length 17, DumpStyle BYTE 

Record Type = PRIMARY_RECORD  Record Attributes = NULL_BITMAP Record Size = 17 

Memory Dump @0x0000002262C7A060 

0000000000000000: 10000e00 02000000 03000000 803f0300 00  .............?... 
        |  |  | |  | |null bitmap (1 byte) 
        |  |  | |  |column count (2 bytes) 
        |  |  | |Value column data (4-byte real) 
        |  |  |SigId column data (2-byte smallint) 
        |  |LogId column data (4-byte int) 
        |Record header (2-byte record type and 2 byte offset to null bitmap) 

là tại sao chiều dài kỷ lục thực sự của bạn là 25 thay vì 17 như trong ví dụ này, nguyên nhân có thể là thay đổi sơ đồ đã được thực hiện sau khi bàn là ban đầu tạo ed như Martin gợi ý trong bình luận của anh. Nếu cơ sở dữ liệu có một mức cô lập phiên bản hàng được kích hoạt, sẽ có thêm chi phí như đã đề cập trong bài đăng trên blog của Paul nhưng tôi nghi ngờ đó là lý do ở đây vì chi phí trên sẽ lớn hơn 8 byte.

+0

Chúc mừng năm mới đầu tiên. Tôi * cuối cùng * quay lại văn phòng và có thể kiểm tra điều này. Thật vậy, tôi hoàn toàn xây dựng lại bảng và có kích thước hàng trung bình là 17! Cảm ơn bạn – rst

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