· 8 years ago · Nov 27, 2017, 05:52 PM
1USE tempdb
2
3DROP TABLE IF EXISTS dbo.SkewedUp
4
5CREATE TABLE dbo.SkewedUp (Id INT NOT NULL, INDEX cx_su CLUSTERED (Id))
6
7INSERT dbo.SkewedUp WITH ( TABLOCK ) ( Id )
8SELECT CASE WHEN x.r % 15 = 0 THEN 1
9 WHEN x.r % 5 = 0 THEN 1000
10 WHEN x.r % 3 = 0 THEN 10000
11 ELSE 100000
12 END AS Id
13FROM ( SELECT TOP 1000000 ROW_NUMBER() OVER ( ORDER BY @@DBTS ) AS r
14 FROM sys.messages AS m
15 CROSS JOIN sys.messages AS m2 ) AS x;
16
17UPDATE STATISTICS dbo.SkewedUp WITH FULLSCAN
18
19SELECT su.Id, COUNT(*) AS records
20FROM dbo.SkewedUp AS su
21GROUP BY su.Id
22
23GO
24
25CREATE OR ALTER PROC dbo.if_logic
26(
27 @Id INT
28)
29AS
30 BEGIN
31
32 IF @Id = 1
33 BEGIN
34
35 SELECT COUNT(*)
36 FROM dbo.SkewedUp AS su
37 WHERE su.Id = @Id
38 OPTION ( OPTIMIZE FOR ( @Id = 1 ));
39
40 END;
41
42 IF @Id > 1
43 BEGIN
44
45 SELECT COUNT(*)
46 FROM dbo.SkewedUp AS su
47 WHERE su.Id = @Id
48 OPTION ( OPTIMIZE FOR ( @Id = 100000 ));
49
50 END;
51
52 END;
53
54
55EXEC dbo.if_logic @Id = 1
56
57EXEC dbo.if_logic @Id = 100000