-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathLab#7.sql
More file actions
165 lines (135 loc) · 4.23 KB
/
Lab#7.sql
File metadata and controls
165 lines (135 loc) · 4.23 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
USE AdventureWorks2017
-- 6
SELECT * INTO dbo.SalesOrderHeader FROM Sales.SalesOrderHeader;
SELECT * INTO dbo.SalesOrderDetail FROM Sales.SalesOrderDetail;
SELECT * INTO dbo.SalesPerson FROM Sales.SalesPerson;
-- Ejercicio 1
-- a
SELECT ProductID
FROM Sales.SalesOrderDetail;
SELECT ProductID
FROM dbo.SalesOrderDetail;
-- e
-- Cree indice sobre 'dbo.SalesOrderDetail'
-- para mejorar el rendimiento de la consulta:
SELECT ProductID
FROM dbo.SalesOrderDetail;
CREATE INDEX IndexProductID ON dbo.SalesOrderDetail(ProductID);
-- f
SELECT ProductID
FROM Sales.SalesOrderDetail;
SELECT ProductID
FROM dbo.SalesOrderDetail;
-- g
-- Eliminar indice creado en 'e'
-- Ejercicio 2
-- a
SELECT *
FROM dbo.SalesOrderHeader
WHERE TotalDue BETWEEN 500 AND 40000;
-- d
-- crear indice sobre 'TotalDue' de la tabla 'dbo.SalesOrderHeader'
-- para mejorar el rendimiento de la consulta
CREATE INDEX IndexTotalDue ON dbo.SalesOrderHeader(TotalDue);
-- e
SELECT *
FROM dbo.SalesOrderHeader
WHERE TotalDue BETWEEN 500 AND 40000;
-- f
SELECT TotalDue
FROM dbo.SalesOrderHeader
WHERE TotalDue BETWEEN 500 AND 40000;
-- h
SELECT SalesOrderID, TotalDue
FROM dbo.SalesOrderHeader
WHERE TotalDue BETWEEN 500 AND 40000;
-- j
-- Elimine indice creado en 'd'
-- Cree uno nuevo segun recomendacion de SQL Server
-- para mejorar el rendimiento de la consulta 'f'
CREATE INDEX TotalDueSalesOrderIDInxex ON dbo.SalesOrderHeader(TotalDue)
INCLUDE(SalesOrderID)
-- k
SELECT TotalDue
FROM dbo.SalesOrderHeader
WHERE TotalDue BETWEEN 500 AND 40000;
-- l
SELECT SalesOrderID, TotalDue
FROM dbo.SalesOrderHeader
WHERE ABS(TotalDue) BETWEEN 500 AND 40000;
-- n
SELECT SalesOrderID, TotalDue
FROM dbo.SalesOrderHeader
WHERE TotalDue BETWEEN 500 AND 40000;
SELECT SalesOrderID, TotalDue
FROM dbo.SalesOrderHeader
WHERE ABS(TotalDue) BETWEEN 500 AND 40000;
-- p
-- elimine indice creado en 'j'
-- Ejercicio 3
-- a
SELECT h.SalesOrderID, d.SalesOrderDetailID, h.SalesPersonID
FROM Sales.SalesOrderHeader h
JOIN Sales.SalesOrderDetail d
ON d.SalesOrderID = h.SalesOrderID
JOIN Sales.SalesPerson p
ON p.BusinessEntityID = h.SalesPersonID;
SELECT h.SalesOrderID, d.SalesOrderDetailID, h.SalesPersonID
FROM dbo.SalesOrderHeader h
JOIN dbo.SalesOrderDetail d
ON d.SalesOrderID = h.SalesOrderID
JOIN dbo.SalesPerson p
ON p.BusinessEntityID = h.SalesPersonID;
-- e
-- mejorar segunda consulta de 'a' creando indices
CREATE INDEX SalesOrderHeaderIndex ON dbo.SalesOrderHeader(SalesPersonID) -- h
INCLUDE(SalesOrderID)
CREATE INDEX SalesOrderDetailIndex ON dbo.SalesOrderDetail(SalesOrderID,SalesOrderDetailID) -- d
CREATE INDEX SalesPersonIndex ON dbo.SalesPerson(BusinessEntityID) -- p
-- f
SELECT h.SalesOrderID, d.SalesOrderDetailID, h.SalesPersonID
FROM Sales.SalesOrderHeader h
JOIN Sales.SalesOrderDetail d
ON d.SalesOrderID = h.SalesOrderID
JOIN Sales.SalesPerson p
ON p.BusinessEntityID = h.SalesPersonID;
SELECT h.SalesOrderID, d.SalesOrderDetailID, h.SalesPersonID
FROM dbo.SalesOrderHeader h
JOIN dbo.SalesOrderDetail d
ON d.SalesOrderID = h.SalesOrderID
JOIN dbo.SalesPerson p
ON p.BusinessEntityID = h.SalesPersonID;
-- g
-- eliminar indices creados en 'e'
-- Ejercicio 4
-- a
SELECT SalesOrderID, SalesPersonID, ShipDate
FROM dbo.SalesOrderHeader WHERE
SalesPersonID IN
(SELECT BusinessEntityID
FROM dbo.SalesPerson
WHERE TerritoryID > 5)
AND ShipDate > '2014-01-01'
-- c
-- reescribir 'a' para no tener consulta anidada
SELECT SalesOrderID, SalesPersonID, ShipDate
FROM dbo.SalesOrderHeader AS SOH
JOIN dbo.SalesPerson AS SP
ON SOH.SalesPersonID = SP.BusinessEntityID
WHERE SP.TerritoryID > 5
AND SOH.ShipDate > '2014-01-01'
-- El peso esta en SalesOrderHeader, por lo tanto hay que buscar optimizarla con un indice
-- Un indice en Shipdate permitiria que la DBMS haga un operador Index Seek, consuminedo menos en el lote.
-- e
-- cree indices para mejorar la consulta de 'c'
CREATE INDEX SalesOrderHeaderOptimizationIndex ON dbo.SalesOrderHeader(SalesPersonID,ShipDate)
INCLUDE(SalesOrderID)
CREATE INDEX SalesPersonOptimizationIndex ON dbo.SalesPerson(BusinessEntityID, TerritoryID)
-- f
-- vuelva a ejecutar 'c'
SELECT SalesOrderID, SalesPersonID, ShipDate
FROM dbo.SalesOrderHeader AS SOH
JOIN dbo.SalesPerson AS SP
ON SOH.SalesPersonID = SP.BusinessEntityID
WHERE SP.TerritoryID > 5
AND SOH.ShipDate > '2014-01-01'