go backarticles

Articles of SQLschool.gr Team

SQL Server Allocation Units

Antonios Chatzipavlis

Overview

Συνεχίζοντας την "κατάδυση" μας στα SQL Server internals σε αυτό το άρθρο θα ασχοληθούμε με τα Allocation Units τα οποία μπορούμε να δούμε με την χρήση της DMV sys.allocation_units.

Στο προηγούμενο άρθρο μου (In which pages (data or index) are my table data stored?) είδαμε πώς μπορούμε να δούμε τα pages που περιέχουν τα δεδομένα ή τα index data ενός συγκεκριμένου object κάνοντας χρήση ενός undocumented DMF.

Example

Αν στο query στο οποίο κάνουμε την χρήση του DMF προσθέσουμε το πεδίο allocation unit θα παρατηρήσουμε ότι για τις σελίδες του clustered index έχουμε την ίδια τιμή και το ίδιο ισχύει και για τις σελίδες του nonclustered index. Άρα έχουμε δύο διαφορετικά allocation units όπως δείχνω στο παρακάτω παράδειγμα.

Example Script

create database bindb;
go

use bindb;
go

create table X (col1 int, col2 datetime2(7), col3 char(100));
go

insert into X values (1,SYSDATETIME(),'a') ;
go

create clustered index cidx on x(col1);
go

create  index idx on x(col2);
go

select 
         db_name(p.database_id)          as [database_name]
    ,    object_name(p.object_id)        as table_name
    ,    i.[name]                        as index_name
    ,    is_allocated
    ,    allocated_page_file_id          as [file_id]
    ,    allocated_page_page_id          as [page_id]
    ,    page_type_desc
    ,    page_level
    ,    previous_page_page_id           as previous_page_id
    ,    next_page_page_id               as next_page_id
    ,     p.allocation_unit_id
from 
    sys.dm_db_database_page_allocations (
                            db_id()
                        ,   object_id('x')
                        ,   null
                        ,   null
                        ,   'detailed'
                                        ) as p
left outer join sys.indexes i  on i.object_id = p.object_id and i.index_id = p.index_id
order by  table_name , index_name, page_level desc, is_allocated desc, previous_page_page_id;
go
Execution Result of sys.dm_db_database_page_allocations
database_name table_name index_name is_allocated file_id page_id page_type_desc page_level previous_page_id next_page_id allocation_unit_id
bindb X cidx 1 1 127 IAM_PAGE 0 0 0 72057594049724416
bindb X cidx 1 1 280 DATA_PAGE 0 0 0 72057594049724416
bindb X cidx 0 1 281 0 0 0 72057594049724416
bindb X cidx 0 1 282 0 0 0 72057594049724416
bindb X cidx 0 1 283 0 0 0 72057594049724416
bindb X cidx 0 1 284 0 0 0 72057594049724416
bindb X cidx 0 1 285 0 0 0 72057594049724416
bindb X cidx 0 1 286 0 0 0 72057594049724416
bindb X cidx 0 1 287 0 0 0 72057594049724416
bindb X idx 1 1 126 IAM_PAGE 0 0 0 72057594049789952
bindb X idx 1 1 264 INDEX_PAGE 0 0 0 72057594049789952
bindb X idx 0 1 265 0 0 0 72057594049789952
bindb X idx 0 1 266 0 0 0 72057594049789952
bindb X idx 0 1 267 0 0 0 72057594049789952
bindb X idx 0 1 268 0 0 0 72057594049789952
bindb X idx 0 1 269 0 0 0 72057594049789952
bindb X idx 0 1 270 0 0 0 72057594049789952
bindb X idx 0 1 271 0 0 0 72057594049789952

Query allocation units

Αν τώρα πάρουμε αυτές τις τιμές και ρωτήσουμε για αυτές το DMV sys.allocation_units θα δούμε τα συγκεντρωτικά νούμερα που πραγματικά ταιριάζουν.
Το total_pages δείχνει το σύνολο των σελίδων.
Το used_pages είναι θεωρώ ξεκάθαρο.
Το data_pages δεν περιλαμβάνει τις IAM.

Query allocation units

select * from sys.allocation_units
where allocation_unit_id in (72057594049724416,72057594049789952);
go
Execution Result of allocation units
allocation_unit_id type type_desc container_id data_space_id total_pages used_pages data_pages
72057594049724416 1 IN_ROW_DATA 72057594043236352 1 9 2 1
72057594049789952 1 IN_ROW_DATA 72057594043301888 1 9 2 1

What is Allocation Unit - Summary

Εύκολα πλέον μπορούμε να καταλάβουμε τι είναι το allocation unit αλλά ας το εξηγήσουμε.

Όπως έχω πει πολλές φορές ο SQL Server τοποθετεί τα δεδομένα σε 8KB pages οι οποίες μπορεί να περιέχουν τα πραγματικά δεδομένα του πίνακα, τα index data, τα large object data και τα row overflow data. Όλα αυτά τα pages αντί να είναι άμεσα συνδεδεμένα με το εκάστοτε πίνακα οργανώνονται σε λογικές οντότητες που είναι τα allocation units για κάθε ένα από τα παραπάνω περιεχόμενα που αυτά μπορεί να έχουν.

Μια τελευταία παρατήρηση που πρέπει να γίνει είναι ότι αν υπάρχουν partitions αυτά είναι ανά partition.


//Antonios Chatzipavlis


Antonios Chatzipavlis

Antonios Chatzipavlis

Antonios is a Data Solutions Consultant and Trainer. He has been working in IT since 1988. In his career, he has worked as senior developer, IT Manager, Solutions Architect and IT Consultant. Since 1995 he has been devoted on new technologies and software development tools, mainly by Microsoft, either by training company staff and colleagues or assisting them in design, development and implementation as a consultant or chief developer. He has focused in Databases and Data Science since 1995. He specialized in Microsoft SQL Server since version 6.0 in areas like SQL Server Internals, Database Design and Development, Business Intelligence and in 2010 he has started working with Azure Data Platform, NoSQL databases, Big Data Technologies and Machine Learning. He is an active member of many IT communities in Greece, answering colleagues' questions and writing articles in his web site. He is the owner of SQLschool.gr which is a community portal with a lot of information about Microsoft SQL Server. He has been a Microsoft Certified Trainer (MCT) since 2000. Microsoft honored him as MVP on Data Platform due to his activities in SQL Server since 2010. He holds a large number of Microsoft Certifications and Microsoft SQL Server Certifications since version 6.5.



Leave your comment

COMMENT

FULL NAME

EMAIL ADDRESS

We use Gravatar

WEB SITE



captcha


 

Newsletter

If you want to receive updates from us subscribe below with your email.
Follow us in
sql school greece logo
© 2010-2021 All rights reserved

This site uses cookies for operational and analytics purposes only. By continuing to browse this site, you agree to their use.