Repository navigation
Expand file tree
/
Copy path34_SQL_Table-Partitioning.sql
More file actions
186 lines (155 loc) · 5.8 KB
/
Copy path34_SQL_Table-Partitioning.sql
File metadata and controls
186 lines (155 loc) · 5.8 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
-----------------SQL TABLE PARTITIONING----------------
/*
SQL partycjonowanie - dzieli duza tabele na mniejsze partycje
a jednocześnie jest traktowana jako pojedyncza tabela logiczna.
Jesli podzielimy sobie duza tabele na partycje to SQL nie musi
skanowac calej tabeli lub indexu, co znacznie poprawia wydajnosc.
Partycje pozwalaja tez na procesowanie rownolegle (parallel processing)
Procesory moga dzialac rownoczesnie na roznych partycjach.
1. Partition Function - definiuje logike okreslająca, jak podzielic dane na partycje
Stanie sie to na podstawie klucza partycjonowania (Partition Key) like
(Column,Region,Dates..)
2. Filegroups - Logiczny kontener na jeden lub więcej plikow danych, pomagajacy organizowac partycje.
3. Datafiles - przypisujemy do naszych filegroups pliki .ndf. To fizyczne pliki
gdzie nasze dane bede faktycznie przechowywane.
4. Partition Scheme - musimy zmapowac nasze partycje do naszych filegrops (grup plikow)
5. Create the Partitioned Table
6. Insert Data Into thje Partitioned Table
*/
--1.
CREATE PARTITION FUNCTION PartitionByYear (DATE)
AS RANGE LEFT FOR VALUES ('2023-12-31', '2024-12-31', '2025-12-31')
SELECT
name,
function_id,
type,
type_desc,
boundary_value_on_right
FROM sys.partition_functions
-- barra zaleca sprawdzanie czy moze mamy juz
-- funkcje partycjonujaca w naszym projekcie
-----------------------------------------------------------------------
--2.
ALTER DATABASE SalesDB ADD FILEGROUP FG_2023;
ALTER DATABASE SalesDB ADD FILEGROUP FG_2024;
ALTER DATABASE SalesDB ADD FILEGROUP FG_2025;
ALTER DATABASE SalesDB ADD FILEGROUP FG_2026;
ALTER DATABASE SalesDB REMOVE FILEGROUP FG_2023;
SELECT*
FROM sys.filegroups
WHERE type = 'FG'
-- tak sprawdzamy nasze Filegroups
-----------------------------------------------------------------------
--3.
ALTER DATABASE SalesDB ADD FILE
(
NAME = P_2023, -- Logical Name
FILENAME = 'C:\Program Files\Microsoft SQL Server\MSSQL17.MSSQLSERVER\MSSQL\DATA\P_2023.mdf'
-- w prawdziwych projektach trzeba spytac sie admina bazy danych gdzie mozna dac swoje
-- datefiles dla partycji
) TO FILEGROUP FG_2023;
ALTER DATABASE SalesDB ADD FILE
(
NAME = P_2024, -- Logical Name
FILENAME = 'C:\Program Files\Microsoft SQL Server\MSSQL17.MSSQLSERVER\MSSQL\DATA\P_2024.mdf'
-- w prawdziwych projektach trzeba spytac sie admina bazy danych gdzie mozna dac swoje
-- datefiles dla partycji
) TO FILEGROUP FG_2024;
ALTER DATABASE SalesDB ADD FILE
(
NAME = P_2025, -- Logical Name
FILENAME = 'C:\Program Files\Microsoft SQL Server\MSSQL17.MSSQLSERVER\MSSQL\DATA\P_2025.mdf'
-- w prawdziwych projektach trzeba spytac sie admina bazy danych gdzie mozna dac swoje
-- datefiles dla partycji
) TO FILEGROUP FG_2025;
ALTER DATABASE SalesDB ADD FILE
(
NAME = P_2026, -- Logical Name
FILENAME = 'C:\Program Files\Microsoft SQL Server\MSSQL17.MSSQLSERVER\MSSQL\DATA\P_2026.mdf'
-- w prawdziwych projektach trzeba spytac sie admina bazy danych gdzie mozna dac swoje
-- datefiles dla partycji
) TO FILEGROUP FG_2026;
SELECT
fg.name AS FilegroupName,
mf.name AS LogicalFileName,
mf.physical_name AS PhysicalFilePath,
mf.size / 128 AS SizeInMB
FROM
sys.filegroups fg
JOIN
sys.master_files mf ON fg.data_space_id = mf.data_space_id
WHERE
mf.database_id = DB_ID('SalesDB');
-----------------------------------------------------------------------------------------------------
--4.
CREATE PARTITION SCHEME SchemePartitionByYear
AS PARTITION PartitionByYear
TO (FG_2023,FG_2024,FG_2025,FG_2026) -- tutaj musimy zwrocic uwage na wlasciwa kolejnosc!
SELECT
ps.name AS PartitionSchemeName,
pf.name AS PartitionFunctionName,
ds.destination_id AS PartitionNumber,
fg.name AS FilegroupName
FROM sys.partition_schemes ps
JOIN sys.partition_functions pf ON ps.function_id = pf.function_id
JOIN sys.destination_data_spaces ds ON ps.data_space_id = ds.partition_scheme_id
JOIN sys.filegroups fg ON ds.data_space_id = fg.data_space_id
-----------------------------------------------------------------------------------------------------
--5.
CREATE TABLE Sales.Orders_Partitioned
(
OrderID INT,
OrderDate DATE,
Sales INT
) ON SchemePartitionByYear (OrderDate)
-----------------------------------------------------------------------------------------------------
--6.
TRUNCATE TABLE Sales.Orders_Partitioned
INSERT INTO Sales.Orders_Partitioned VALUES
(1, '2023-05-15', 100),
(2, '2024-07-20', 100),
(3, '2025-02-01', 100),
(4,'2026-06-23',100);
SELECT*
FROM Sales.Orders_Partitioned
SELECT
OBJECT_NAME(p.object_id) AS ObjectName,
p.partition_number AS ParitionNumber,
f.name AS PartitionFilefroup,
p.rows AS NumberOfRows
FROM sys.partitions p
JOIN sys.destination_data_spaces dds ON p.partition_number = dds.destination_id
JOIN sys.filegroups f ON dds.data_space_id = F.data_space_id
WHERE OBJECT_NAME(p.object_id) = 'Orders_Partitioned'; -- sktypt barry
SELECT
t.name AS TableName,
ps.name AS PartitionScheme,
p.partition_number AS PartitionNumber,
p.rows AS NumberOfRows
FROM sys.tables t
JOIN sys.indexes i
ON t.object_id = i.object_id
JOIN sys.partition_schemes ps
ON i.data_space_id = ps.data_space_id
JOIN sys.partitions p
ON i.object_id = p.object_id
AND i.index_id = p.index_id
WHERE i.index_id IN (0, 1)
ORDER BY t.name, p.partition_number; -- sktypt ai
-------------------------------------------------------------------------------------------
--Sprawdzanie wydajnosci naszej partycji
SELECT*
INTO Sales.Orders_NotPartioned
FROM Sales.Orders_Partitioned
SELECT*
FROM Sales.Orders_NotPartioned
WHERE OrderDate = '2026-01-01'; -- odczytano 4 wiersze (plan wykonania -> wlasciwosci)
SELECT*
FROM Sales.Orders_Partitioned
WHERE OrderDate = '2026-01-01'; -- odczytano 1 wiersz
SELECT*
FROM Sales.Orders_NotPartioned
WHERE OrderDate IN ( '2026-01-01','2025-12-31'); -- 4 wiersze
SELECT*
FROM Sales.Orders_Partitioned
WHERE OrderDate IN ('2026-01-01','2025-12-31'); -- 2 wiersze