_대문 | 방명록 | 최근글 | 홈피소개 | 주인놈
FrontPage › NullTest

Contents

[-]
1 sp_AllocationMetadata
2 Null Bitmap Size


1 sp_AllocationMetadata #

USE master;
GO

IF OBJECT_ID ('sp_AllocationMetadata') IS NOT NULL
   DROP PROCEDURE sp_AllocationMetadata;
GO

CREATE PROCEDURE sp_AllocationMetadata
(
   @object VARCHAR (128) = NULL
)
AS
SELECT
   OBJECT_NAME (sp.object_id) AS [Object Name],
   sp.index_id AS [Index ID],
   sa.allocation_unit_id AS [Alloc Unit ID],
   sa.type_desc AS [Alloc Unit Type],
   '(' + CONVERT (VARCHAR (6),
      CONVERT (INT, SUBSTRING (sa.first_page, 6, 1) +
         SUBSTRING (sa.first_page, 5, 1))) +
   ':' + CONVERT (VARCHAR (20),
      CONVERT (INT, SUBSTRING (sa.first_page, 4, 1) +
         SUBSTRING (sa.first_page, 3, 1) +
         SUBSTRING (sa.first_page, 2, 1) +
         SUBSTRING (sa.first_page, 1, 1))) +
   ')' AS [First Page],
   '(' + CONVERT (VARCHAR (6),
      CONVERT (INT,
         SUBSTRING (sa.root_page, 6, 1) +
         SUBSTRING (sa.root_page, 5, 1))) +
   ':' + CONVERT (VARCHAR (20),
      CONVERT (INT,
         SUBSTRING (sa.root_page, 4, 1) +
         SUBSTRING (sa.root_page, 3, 1) +
         SUBSTRING (sa.root_page, 2, 1) +
         SUBSTRING (sa.root_page, 1, 1))) +
   ')' AS [Root Page],
   '(' + CONVERT (VARCHAR (6),
      CONVERT (INT,
         SUBSTRING (sa.first_iam_page, 6, 1) +
         SUBSTRING (sa.first_iam_page, 5, 1))) +
   ':' + CONVERT (VARCHAR (20),
      CONVERT (INT,
         SUBSTRING (sa.first_iam_page, 4, 1) +
         SUBSTRING (sa.first_iam_page, 3, 1) +
         SUBSTRING (sa.first_iam_page, 2, 1) +
         SUBSTRING (sa.first_iam_page, 1, 1))) +
   ')' AS [First IAM Page] 
FROM
   sys.system_internals_allocation_units AS sa,
   sys.partitions AS sp
WHERE
   sa.container_id = sp.partition_id
   AND sp.object_id =
      (CASE WHEN (@object IS NULL)
         THEN sp.object_id
         ELSE OBJECT_ID (@object)
      END);
GO

EXEC sys.sp_MS_marksystemobject sp_AllocationMetadata;
GO

2 Null Bitmap Size #

use tempdb
go

CREATE TABLE t1 (
    c1 INT, c2 INT, c3 INT, c4 INT, c5 INT,
    c6 INT, c7 INT, c8 INT, c9 INT, c10 INT);
GO 

CREATE TABLE t2 (
    c1 INT NOT NULL, c2 INT NOT NULL, c3 INT NOT NULL,
    c4 INT NOT NULL, c5 INT NOT NULL, c6 INT NOT NULL,
    c7 INT NOT NULL, c8 INT NOT NULL, c9 INT NOT NULL,
    c10 INT);
GO 

INSERT INTO t1 VALUES (1, 2, 3, 4, 5, 6, 7, 8, 9, 10);
GO 

INSERT INTO t2 VALUES ( 1, 2, 3, 4, 5, 6, 7, 8, 9, NULL);
GO 

EXEC sp_AllocationMetadata 't1';
EXEC sp_AllocationMetadata 't2';

결과
Object Name      Index ID        Alloc Unit ID Alloc Unit Type First Page  Root Page First IAM Page
------------- ----------- -------------------- --------------- ----------- --------- --------------
t1                      0    72057649233985536 IN_ROW_DATA     (4:82)      (0:0)     (3:278)


Object Name      Index ID        Alloc Unit ID Alloc Unit Type First Page  Root Page First IAM Page
------------- ----------- -------------------- --------------- ----------- --------- --------------
t2                      0    72057649234051072 IN_ROW_DATA     (1:4461784) (0:0)     (5:520217)

DBCC PAGE ({dbid|dbname}, filenum, pagenum, print option)
  • dbid|dbname - 페이지를 포함하고 있는 db의 id 또는 이름
  • filenum - 페이지를 포함하고 있는 파일의 번호
  • pagenum - 파일내의 페이지 번호
  • print option - 출력옵션
    • 0 - 버퍼 헤더와 페이지 헤더를 출력(디폴터)
    • 1 - 버퍼 헤더, 페이지 헤더, 각 행들, 행 오프셋 테이블들을 출력
    • 2 - 버퍼 및 페이지 헤더, 페이지 전체, 행 오프셋 테이블들을 출력
    • 3 - 버퍼 헤더, 페이지 헤더, 각행들, 행 오프셋 테이블들을 출력


dbcc traceon(3604)
dbcc page (tempdb, 4, 82, 3)

Record Type = PRIMARY_RECORD Record Attributes = NULL_BITMAP
Memory Dump @0x6106C060

00000000: 10002c00 01000000 02000000 03000000 †..,.............
00000010: 04000000 05000000 06000000 07000000 †................
00000020: 08000000 09000000 0a000000 0a0000fc †................

dbcc page (tempdb, 1, 4461784, 3)

Record Type = PRIMARY_RECORD Record Attributes = NULL_BITMAP
Memory Dump @0x5F06C060

00000000: 10002c00 01000000 02000000 03000000 †..,.............
00000010: 04000000 05000000 06000000 07000000 †................
00000020: 08000000 09000000 0a000000 0a0000fe †................

dbcc traceoff(3604)

결과해석
  • 0a0000fc -> 역순으로 0xfc 0x00 0x00 0x0a
  • 0xfc 0x00 --> 1111110000000000 --> 1 ~ 10 컬럼은 Null이 아니고, 6bit는 사용되지 않는다.
  • 0xfe 0x00 --> 1111111000000000 --> t2.c10 컬럼이 Null이므로 10번째 bit는 1이다.


그래서? 뭐.. 어쩌라고..
이거 알면 뭘 더 잘할 수 있는데?
엔지니어의 욕심이다..
EditText : Print : Mobile : FindPage : DeletePage : LikePages : Powered by MoniWiki : Last modified 2018-04-13 23:12:53

길 위에서 어둠을 맞는다면 너는 진실로 너 혼자가 아닌 한 사람의 친구가 필요하다는 것을 깨닫게 될 것이다.