Repository navigation
Expand file tree
/
Copy path32_SQL_Execution-Plans.sql
More file actions
120 lines (96 loc) · 3.67 KB
/
Copy path32_SQL_Execution-Plans.sql
File metadata and controls
120 lines (96 loc) · 3.67 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
-----------------SQL Execution Plans----------------
/*
Jest to plan wygenerowany przez baze danych ktory
mowi o tym jak wykonywane bedzie zapytanie krok po
kroku.
Mamy 3 przyciski na gorze UI
- wyswietl szacowany plan wykonania,
- uwzglednij rzeczywisty plan wykonania,
- uwzglednij statystyke zapytan na zywo
Jesli przewidywania nie zgadzaja sie z faktycznym planem wykonania,
to wskazuje to na problemy takie jak niedokladne statystyki tabel lub
przedawnione indexy co prowadzi to niskiej wydajnosci.
NOTE: Warto sprawdzic w sekcji wlasciwosc -> obiekt czy SQL
uzywa naszego utoworzonego indeksu.
TABLE scan -- odcztuje wszystkie wpisy w tabeli, aby znalesc wyniki.
INDEX Scan -- odczytuje wszystkie wpisy w indexie aby znalesc wyniki.
INDEX Seek -- to wycelowane wyszukanie w obrebie indexu,
wydobywajac tylko okreslone wiersze. (jest to dobry znak,
bo SQL nie czyta calej tabeli (albo indexu) tylko jakas jej czesc).
Nested Loops (Pętle zagnieżdżone): Porównuje wiersze z dwóch tabel, wiersz po wierszu.
Najlepiej sprawdza się przy niewielkich zbiorach danych.
Hash Match (Łączenie za pomocą tablicy haszującej): Dopasowuje wiersze przy użyciu tablicy haszującej.
Najlepiej sprawdza się przy dużych zbiorach danych.
Merge Join (Łączenie przez scalanie): Łączy dwa uporządkowane zbiory danych.
Jest wydajne, gdy oba zbiory są już posortowane według kolumn używanych do łączenia.
*/
----------------------------------------------------------
SELECT*
INTO FactResellerSales_HP
FROM FactResellerSales
----------------------------------------------------------
SELECT*
FROM FactResellerSales_HP
ORDER BY SalesOrderNumber;
SELECT*
FROM FactResellerSales
ORDER BY SalesOrderNumber;
----------------------------------------------------------
SELECT*
FROM FactResellerSales_HP
WHERE CarrierTrackingNumber = '4911-403C-98';
SELECT*
FROM FactResellerSales
WHERE CarrierTrackingNumber = '4911-403C-98';
CREATE NONCLUSTERED INDEX idx_FactReseller_CTN
ON FactResellerSales (CarrierTrackingNumber)
---------------------------------------------------------
CREATE CLUSTERED COLUMNSTORE INDEX idx_FactResellerSales_HP
ON FactResellerSales_HP
SELECT
p.EnglishProductName AS ProductName,
SUM(s.SalesAmount) AS TotalSales
FROM FactResellerSales s
JOIN DimProduct p
ON p.ProductKey = s.ProductKey
GROUP BY p.EnglishProductName;
SELECT
p.EnglishProductName AS ProductName,
SUM(s.SalesAmount) AS TotalSales
FROM FactResellerSales_HP s
JOIN DimProduct p
ON p.ProductKey = s.ProductKey
GROUP BY p.EnglishProductName; -- to dac w innym query bo nam porowna to samo wtedy
/*
Zeby porownac 2 takie zapytania dajemy:
prawy przycisk na ekranie planu wykonywania -> Zapisz plan wykonywania jako ->
potem na drugim query -> prawy -> porownaj plan pokazow
*/
--------------SQL HINTS--------------
/*
Komendy ktore dodajemy do zapytania aby zmusic baze danych
by wykonala nasze zapytanie w konkretny sposob by wymusic
lepszy performance.
Czasem baza danych nie bedzie sama dobierac idealnych execution plans,
poniewaz np mamy nieaktualne statystyki tabel, lub mamy za duzo indexow
w bazie danych.
*/
USE SalesDB
SELECT
o.Sales,
c.Country
FROM Sales.Orders o
LEFT JOIN Sales.Customers c WITH (FORCESEEK) -- wymuszamy index seek na sales.customers
ON o.CustomerID = c.CustomerID
--OPTION (HASH JOIN) -- wplywamy bezposrednio na execution plan. wymuszamy tu hash join
SELECT
o.Sales,
c.Country
FROM Sales.Orders o
LEFT JOIN Sales.Customers c WITH (INDEX([PK_customers])) -- wymuszamy uzycie konkretnego indexu
ON o.CustomerID = c.CustomerID
/*GOOD PRACTICES
1. testuj hinty w roznych bazach danych (development, production)
ich wydajnosc moze sie wtedy roznic.
2. hinty to szybkie laty. nalezy znalesc problem i go rozwiazac
*/