Changes between Version 2 and Version 3 of DataStoringOrganization


Ignore:
Timestamp:
02/07/26 17:26:14 (21 hours ago)
Author:
185022
Comment:

--

Legend:

Unmodified
Added
Removed
Modified
  • DataStoringOrganization

    v2 v3  
    11= Организација на складирање на податоци во Датотечни системи
     2
     3== Цел
     4
     5Целта овде е оптимизација на складирањето и перформансите преку:
     6* распределба на податоците во `filegroups` по временски период
     7* партиционирање по датум (година/деценија)
     8* clustered индекси поставени на `partition scheme` за да се активира `partitioning`
     9
     10== Filegroups по временски период
     11
     12Креирани се `filegroups` за логичка/физичка сегментација на податоците:
     13
     14* `FG_Old` (пред 2000)
     15* `FG_2000s` (2000-2009)
     16* `FG_2010s` (2010-2019)
     17* `FG_2020s` (2020-2029)
     18* `FG_Future` (2030+)
     19
     20Причина:
     21* подобро управување со големи податочни сетови (VLDB пристап)
     22* можност за backup/restore по filegroup
     23* подобра I/O локалност и одржување (архивирање на стари партиции)
     24
     25{{{#!sql
     26alter database HospitalSyntheaDB add filegroup FG_Old;
     27go
     28alter database HospitalSyntheaDB add file (name='FG_Old', filename='C:\Users\User\Documents\DBA\FG_Old.ndf') to filegroup FG_Old;
     29go
     30
     31alter database HospitalSyntheaDB add filegroup FG_2000s;
     32go
     33alter database HospitalSyntheaDB add file (name='FG_2000s', filename='C:\Users\User\Documents\DBA\FG_2000s.ndf') to filegroup FG_2000s;
     34go
     35
     36alter database HospitalSyntheaDB add filegroup FG_2010s;
     37go
     38alter database HospitalSyntheaDB add file (name='FG_2010s', filename='C:\Users\User\Documents\DBA\FG_2010s.ndf') to filegroup FG_2010s;
     39go
     40
     41alter database HospitalSyntheaDB add filegroup FG_2020s;
     42go
     43alter database HospitalSyntheaDB add file (name='FG_2020s', filename='C:\Users\User\Documents\DBA\FG_2020s.ndf') to filegroup FG_2020s;
     44go
     45
     46alter database HospitalSyntheaDB add filegroup FG_Future;
     47go
     48alter database HospitalSyntheaDB add file (name='FG_Future', filename='C:\Users\User\Documents\DBA\FG_Future.ndf') to filegroup FG_Future;
     49go
     50
     51}}}
     52
     53== Партиционирање на Encounters по датум
     54
     55За табелата `encounters` е креирана партициска функција - `pf_Encounters_Year (datetime2)` со `boundaries: 2000, 2010, 2020, 2030` и партициска шема `ps_Encounters_Year` која ги мапира партициите на горните filegroups.
     56
     57{{{#!sql
     58create partition function pf_Encounters_Year (datetime2)
     59as range right for values
     60(
     61    '2000-01-01',
     62    '2010-01-01',
     63    '2020-01-01',
     64    '2030-01-01'
     65);
     66go
     67
     68create partition scheme ps_Encounters_Year
     69as partition pf_Encounters_Year to
     70(
     71    FG_Old,
     72    FG_2000s,
     73    FG_2010s,
     74    FG_2020s,
     75    FG_Future
     76);
     77go
     78}}}
     79
     80=== Clustered индекс на `encounters` со партиционирање
     81
     82Партиционирањето реално се применува ког clustered индексот е креиран врз партициската шема.
     83
     84{{{#!sql
     85create clustered index CI_Encounters_StartDate_Id
     86on encounters(start, Id)
     87on ps_Encounters_Year(start);
     88}}}
     89
     90=== Верификација
     91
     92==== Проверка дека датотечните групи се креирани исправно
     93
     94{{{#!sql
     95select
     96    fg.name as FilegroupName,
     97    df.name as LogicalFileName,
     98    df.type_desc as FileType,
     99    df.physical_name as PhysicalPath,
     100    df.size / 128.0 as SizeMB
     101from sys.filegroups fg
     102left join sys.database_files df ON fg.data_space_id = df.data_space_id
     103order by fg.name;
     104go
     105}}}
     106
     107==== Проверка дека партициската шема и функцијата работат исправно
     108
     109{{{#!sql
     110select
     111    ps.name as PartitionScheme,
     112    pf.name as PartitionFunction,
     113    dds.destination_id as PartitionNumber,
     114    fg.name as FilegroupName,
     115    prv.value as UpperBoundaryValue
     116from sys.partition_schemes ps
     117join sys.partition_functions pf on ps.function_id = pf.function_id
     118join sys.destination_data_spaces dds on ps.data_space_id = dds.partition_scheme_id
     119join sys.filegroups fg on dds.data_space_id = fg.data_space_id
     120left join sys.partition_range_values prv
     121    on pf.function_id = prv.function_id
     122    and dds.destination_id = case when pf.boundary_value_on_right = 1 then prv.boundary_id + 1 else prv.boundary_id end
     123where ps.name = 'ps_Encounters_Year'
     124order by dds.destination_id;
     125go
     126-----------------------------
     127select
     128    fg.name as FilegroupName,
     129    df.name as LogicalFileName,
     130    df.physical_name,
     131    df.size / 128.0 as SizeMB
     132from sys.filegroups fg
     133    left join sys.database_files df on fg.data_space_id = df.data_space_id;
     134go
     135}}}
     136
     137==== Дистрибуција по партиции
     138
     139{{{#!sql
     140select
     141    $partition.pf_Encounters_Year([start]) as PartitionNumber,
     142    count(*) as 'RowCount',
     143    min([start]) as MinDate,
     144    max([start]) as MaxDate
     145from dbo.encounters
     146group by $partition.pf_Encounters_Year([start])
     147order by PartitionNumber;
     148go
     149}}}
     150
     151==== Filegroup usage
     152
     153{{{#!sql
     154select
     155    fg.name as FilegroupName,
     156    count(*) as PartitionCount
     157from sys.partitions p
     158join sys.indexes i on p.object_id = i.object_id and p.index_id = i.index_id
     159join sys.data_spaces ds on i.data_space_id = ds.data_space_id
     160join sys.filegroups fg on ds.data_space_id = fg.data_space_id
     161where object_name(p.object_id) = 'Encounters'
     162group by fg.name;
     163go
     164}}}
     165
     166==== Partition elimination
     167
     168{{{#!sql
     169set statistics io on
     170select count(*) from encounters where [start] >= '2022-01-01';
     171set statistics io off;
     172}}}