-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy path1FullRepro_CoverIndex.sql
More file actions
107 lines (92 loc) · 2.5 KB
/
1FullRepro_CoverIndex.sql
File metadata and controls
107 lines (92 loc) · 2.5 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
DROP TABLE IF EXISTS dbo.SalesOrders;
GO
--Creating table
CREATE TABLE dbo.SalesOrders (
OrderID INT IDENTITY PRIMARY KEY,
CustomerID INT,
OrderDate DATE,
OrderStatus CHAR(1),
TotalAmount DECIMAL(10,2),
ShipCountry NVARCHAR(50),
CreatedAt DATETIME
);
GO
--inserting data in table
;WITH N AS (
SELECT TOP (500000)
ROW_NUMBER() OVER (ORDER BY (SELECT NULL)) AS n
FROM master.sys.all_objects a
CROSS JOIN master.sys.all_objects b
)
INSERT INTO dbo.SalesOrders (CustomerID, OrderDate, OrderStatus, TotalAmount, ShipCountry, CreatedAt)
SELECT
ABS(CHECKSUM(NEWID())) % 1000 + 1,
DATEADD(DAY, -n % 365, GETDATE()),
CASE WHEN n % 5 = 0 THEN 'C' ELSE 'O' END,
ABS(CHECKSUM(NEWID())) % 10000 / 1.0,
CASE n % 4
WHEN 0 THEN 'USA'
WHEN 1 THEN 'Germany'
WHEN 2 THEN 'France'
ELSE 'Canada'
END,
DATEADD(MINUTE, -n, GETDATE())
FROM N;
GO
-- Count rows
SELECT COUNT(*) FROM dbo.SalesOrders;
-- Create initial nonclustered index (IX_Bad)
DROP INDEX IF EXISTS IX_Bad ON dbo.SalesOrders;
GO
CREATE NONCLUSTERED INDEX IX_Bad
ON dbo.SalesOrders (CustomerID);
GO
-- Test query before optimized index
SET STATISTICS IO ON;
SET STATISTICS TIME ON;
GO
SELECT OrderDate, TotalAmount, ShipCountry
FROM dbo.SalesOrders
WHERE CustomerID = 128
AND OrderStatus = 'C';
GO
-- Create covering index
DROP INDEX IF EXISTS IX_Customer_Status_Cover ON dbo.SalesOrders;
GO
CREATE NONCLUSTERED INDEX IX_Customer_Status_Cover
ON dbo.SalesOrders (CustomerID, OrderStatus)
INCLUDE (OrderDate, TotalAmount, ShipCountry);
GO
-- Test query after optimized index
SELECT OrderDate, TotalAmount, ShipCountry
FROM dbo.SalesOrders
WHERE CustomerID = 128
AND OrderStatus = 'C';
GO
-- Test query after optimized index on heavy writes
UPDATE dbo.SalesOrders
SET OrderStatus = 'C'
WHERE OrderStatus = 'O'
AND CreatedAt < DATEADD(DAY, -7, GETDATE());
GO
-- Create balanced index
DROP INDEX IF EXISTS IX_Balanced ON dbo.SalesOrders;
GO
CREATE NONCLUSTERED INDEX IX_Balanced
ON dbo.SalesOrders (CustomerID, OrderStatus)
INCLUDE (OrderDate, TotalAmount);
GO
-- Test query on heavy reads
SELECT OrderDate, TotalAmount, ShipCountry
FROM dbo.SalesOrders
WHERE CustomerID = 128
AND OrderStatus = 'C';
GO
-- Test query on heavy writes(balanced index)
UPDATE dbo.SalesOrders
SET OrderStatus = 'C'
WHERE OrderStatus = 'O'
AND CreatedAt < DATEADD(DAY, -7, GETDATE());
GO
SET STATISTICS TIME,IO OFF;
GO