Presentation Slides



Demo Allocation withing data files

-- create database
USE master
GO

DROP DATABASE IF EXISTS FileAllocDemo;
GO

CREATE DATABASE FileAllocDemo
 CONTAINMENT = NONE
 ON  PRIMARY 
(    NAME = N'FileAllocDemo_P1'
,    FILENAME = N'D:\DATA\FileAllocDemo_P1.mdf' 
,    SIZE = 8192KB , FILEGROWTH = 65536KB ), 
 FILEGROUP [SECONDARY] 
(    NAME = N'FileAllocDemo_S1'
,    FILENAME = N'D:\DATA\FileAllocDemo_S1.ndf' 
,    SIZE = 8192KB , FILEGROWTH = 65536KB ),
(    NAME = N'FileAllocDemo_S2'
,    FILENAME = N'D:\DATA\FileAllocDemo_S2.ndf' 
,    SIZE = 8192KB , FILEGROWTH = 65536KB )
 LOG ON 
(    NAME = N'FileAllocDemo_log'
,    FILENAME = N'D:\DATA\FileAllocDemo_log.ldf' 
,    SIZE = 8192KB , FILEGROWTH = 65536KB )
GO

USE [FileAllocDemo]
GO
IF NOT EXISTS (SELECT name FROM sys.filegroups WHERE is_default=1 AND name = N'SECONDARY') 
    ALTER DATABASE [FileAllocDemo] MODIFY FILEGROUP [SECONDARY] DEFAULT
GO

-- create table
USE FileAllocDemo
GO

CREATE TABLE T
(
    col1 int identity PRIMARY KEY,
    col2 char(8000) default (replicate('a',8000))
)
GO

-- CHECK FILEGROUP

SELECT    OBJECT_SCHEMA_NAME(t.object_id) AS schema_name
    ,    t.name AS table_name
    ,    i.index_id
    ,    fg.name AS filegroup_name
    ,    FORMAT(p.rows, '#,###') AS rows
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
LEFT OUTER JOIN sys.partition_schemes ps ON i.data_space_id=ps.data_space_id
LEFT OUTER JOIN sys.destination_data_spaces dds ON ps.data_space_id=dds.partition_scheme_id AND p.partition_number=dds.destination_id
INNER JOIN sys.filegroups fg ON COALESCE(dds.data_space_id, i.data_space_id)=fg.data_space_id;
GO


-- DEMO PART 1

SELECT    file_id
    ,    name
    ,    FILEGROUP_NAME(data_space_id)
    ,   (size *1.0 )/128   as size_mb
FROM sys.database_files;
GO

INSERT INTO T DEFAULT VALUES;
GO
DBCC EXTENTINFO (0,T,-1);
GO


-- DEMO PART 2

SELECT    file_id
    ,    name
    ,    FILEGROUP_NAME(data_space_id)
    ,   (size * 8) / 1024  as size_mb
FROM sys.database_files;
GO

SET NOCOUNT ON;
INSERT INTO T DEFAULT VALUES;
GO 1000

SELECT    file_id
    ,    name
    ,    FILEGROUP_NAME(data_space_id)
    ,   (size * 8) / 1024  as size_mb
FROM sys.database_files;
GO


Demo Analyzing DB Structures

--Create table and insert test data
use AdventureWorks;
GO
    
IF object_id('viewPage') is not null drop table viewPage; 
GO

CREATE TABLE viewPage
(
    ID int identity(1,1) not null,
    rowData varchar(8000)
)
GO


DECLARE @i int = 1;
WHILE @i <=3 
BEGIN
INSERT INTO    viewPage (rowData) VALUES (REPLICATE(cast(@i as char(1)), 2000))
SET @i = @i + 1
END
GO


-- Find page information
-- DBCC IND replacement 
/*
The new DMF provides replacement functionality for DBCC IND. Based on the parameters provided, it will return a list of all pages that are associated with one or more tables and indexes.  The available parameters for sys.dm_db_database_page_allocations are:
@DatabaseId: Database from which to return the page listing for tables and indexes.  The parameter is required and accepts the use of the DB_ID() function.
@TableId: Object_id for the table from which to return the page listing.  The parameter is required and accepts the use of the OBJECT_ID() function.  NULL can also be used to return all tables.
@IndexId: Index_id from the table which the page list is from.  The parameter is required and accepts the use of NULL to return information for all indexes.
@PartionId: ID of the partition which the page list is returning.  The parameter is required and accepts the use of NULL to return information for all indexes.
@Mode: Defines the mode for returning data, the options are DETAILED or LIMITED.  With LIMITED, the information is limited to page metadata, such as page allocation and relationships information.  Under the DETAILED mode, additional information is provided, such as page type and inter-page relationship chains.
--------------
DMF Column                    DBCC Column                Description
object_id                    ObjectID                Object ID for the table or view
index_id                    IndexID                    ID for the index
partition_id                PartitionNumber            Partition number for the index
rowset_id                    PartitionID                Partition ID for the index
allocation_unit_type_desc    iam_chain_type            Description of the allocation unit
allocated_page_iam_file_id    IAMFID                    File ID for the index allocation map page associated to the page
allocated_page_iam_page_id    IAMPID                    Page ID for the index allocation map page associated to the page
allocated_page_file_id        PageFID                    File ID of the allocated page
allocated_page_page_id        PagePID                    Page ID for the allocated page
page_type                    PageType                Page type ID for the allocated page
page_level                    IndexLevel                Level of the page in B-Tree index
next_page_file_id            NextPageFID                File ID for the next page
next_page_page_id            NextPagePID                Page ID for the next page
previous_page_file_id        PrevPageFID                File ID for the previous page
previous_page_page_id        PrevPagePID                Page ID for the previous page

--------------

New sys.dm_db_database_page_allocations Columns

DMF Column                    Description
database_id                    ID of the database
allocation_unit_id            ID of the allocation unit
allocation_unit_type        Type of allocation unit
data_clone_id                Unknown
clone_state                    Unknown
clone_state_desc            Unknown
extent_file_id                File ID of the extent
extent_page_id                Page ID for the extent
is_allocated                Indicates whether a page is allocated
is_iam_page                    Indicates whether a page is the index allocation page
is_mixed_page_allocation    Indicates whether a page is allocated
page_free_space_percent        Percentage of space free on the page
page_type_desc                Description of the page type
is_page_compressed            Indicates if the page is compressed
has_ghost_records            Indicates if the page has ghost records

*/

select    db_name(database_id) as DatabaseName
    ,    OBJECT_NAME(object_id) as TableName
    ,    allocation_unit_type
    ,    allocation_unit_type_desc
    ,    allocated_page_file_id
    ,    allocated_page_page_id 
from sys.dm_db_database_page_allocations(db_id('AdventureWorks')
                                        ,object_id('viewPage')
                                        ,NULL
                                        ,NULL
                                        ,'DETAILED')
where page_type = 1;
GO



-- Enable trace flag
DBCC TRACEON(3604);
GO


-- View page allocation
dbcc page('AdventureWorks',1,37320,3);
GO


-- Update data
update viewPage set [rowData] = replicate('1',5000) where id = 1;
GO


-- Find page information
select    db_name(database_id) as DatabaseName
    ,    OBJECT_NAME(object_id) as TableName
    ,    allocation_unit_type
    ,    allocation_unit_type_desc
    ,    allocated_page_file_id
    ,    allocated_page_page_id 
from sys.dm_db_database_page_allocations(db_id('AdventureWorks')
                                        ,object_id('viewPage')
                                        ,NULL
                                        ,NULL
                                        ,'DETAILED')
where page_type = 1;
GO

-- View updated page allocation
dbcc page('AdventureWorks',1,37321,3);
GO


Demo Monitor tempDB


-- Amount of space in each tempdb file (Free and Used)
use tempdb
SELECT name, physical_name, SUM(size)*1.0/128 AS [size in MB]
FROM sys.database_files
group by name, physical_name

-- Amount of free space in each tempdb file
SELECT b.name, b.physical_name, SUM(unallocated_extent_page_count) AS [free pages], 
(SUM(unallocated_extent_page_count)*1.0/128) AS [free space in MB]
FROM sys.dm_db_file_space_usage a join sys.database_files b
on a.file_id = b.file_id
GROUP BY b.name, b.physical_name

-- Amount of space used by the version Store
SELECT SUM(version_store_reserved_page_count) AS [version store pages used],
(SUM(version_store_reserved_page_count)*1.0/128) AS [version store space in MB]
FROM sys.dm_db_file_space_usage;

-- Number of pages and the amount of space in MB used by internal objects
SELECT SUM(internal_object_reserved_page_count) AS [internal object pages used],
(SUM(internal_object_reserved_page_count)*1.0/128) AS [internal object space in MB]
FROM sys.dm_db_file_space_usage;

-- Amount of space used by user objects in tempdb
SELECT SUM(user_object_reserved_page_count) AS [user object pages used],
(SUM(user_object_reserved_page_count)*1.0/128) AS [user object space in MB]
FROM sys.dm_db_file_space_usage;