|
| 1 | +USE AdventureWorks2016_EXT; |
| 2 | +GO |
| 3 | + |
| 4 | +-- Create regular table |
| 5 | + |
| 6 | +DROP TABLE IF EXISTS [dbo].[TestSequentialKey]; |
| 7 | +GO |
| 8 | + |
| 9 | +CREATE TABLE [dbo].[TestSequentialKey]( |
| 10 | + [DatabaseLogID] [bigint] IDENTITY(1,1) NOT NULL, |
| 11 | + [PostTime] [datetime2] NOT NULL, |
| 12 | + [DatabaseUser] [sysname] NOT NULL, |
| 13 | + [Event] [sysname] NOT NULL, |
| 14 | + [Schema] [sysname] NULL, |
| 15 | + [Object] [sysname] NULL, |
| 16 | + [TSQL] [nvarchar](max) NOT NULL |
| 17 | + CONSTRAINT [PK_TestSequentialKey_DatabaseLogID] PRIMARY KEY NONCLUSTERED |
| 18 | +( |
| 19 | + [DatabaseLogID] ASC |
| 20 | +)); |
| 21 | + |
| 22 | +CREATE CLUSTERED INDEX CIX_TestSequentialKey_PostTime ON TestSequentialKey (PostTime); |
| 23 | +GO |
| 24 | + |
| 25 | +-- Create optimized table |
| 26 | + |
| 27 | +DROP TABLE IF EXISTS [dbo].[TestSequentialKey_Optimized]; |
| 28 | +GO |
| 29 | + |
| 30 | +CREATE TABLE [dbo].[TestSequentialKey_Optimized]( |
| 31 | + [DatabaseLogID] [bigint] IDENTITY(1,1) NOT NULL, |
| 32 | + [PostTime] [datetime2] NOT NULL, |
| 33 | + [DatabaseUser] [sysname] NOT NULL, |
| 34 | + [Event] [sysname] NOT NULL, |
| 35 | + [Schema] [sysname] NULL, |
| 36 | + [Object] [sysname] NULL, |
| 37 | + [TSQL] [nvarchar](max) NOT NULL |
| 38 | + CONSTRAINT [PK_TestSequentialKey_Optimized_DatabaseLogID] PRIMARY KEY NONCLUSTERED |
| 39 | +( |
| 40 | + [DatabaseLogID] ASC |
| 41 | +) |
| 42 | +WITH (OPTIMIZE_FOR_SEQUENTIAL_KEY=ON)); |
| 43 | + |
| 44 | +CREATE CLUSTERED INDEX CIX_TestSequentialKey_Optimized_PostTime ON TestSequentialKey_Optimized (PostTime) WITH (OPTIMIZE_FOR_SEQUENTIAL_KEY=ON); |
| 45 | +GO |
| 46 | + |
| 47 | +-- Create INSERT stored procedure |
| 48 | + |
| 49 | +CREATE OR ALTER PROCEDURE usp_InsertLogRecord @Optimized bit = 0 AS |
| 50 | + |
| 51 | +DECLARE @PostTime datetime2 = SYSDATETIME(), @User sysname, @Event sysname, @Schema sysname, @Object sysname, @TSQL nvarchar(max) |
| 52 | + |
| 53 | +SELECT @User = name |
| 54 | +FROM sys.sysusers |
| 55 | +WHERE issqlrole = 0 and hasdbaccess = 1 and status = 0 |
| 56 | +ORDER BY NEWID(); |
| 57 | + |
| 58 | +SELECT @Object = t.name, @Schema = s.name |
| 59 | +FROM sys.tables t |
| 60 | +INNER JOIN sys.schemas s ON s.schema_id = t.schema_id |
| 61 | +ORDER BY NEWID(); |
| 62 | + |
| 63 | +IF DATEPART(ms, @PostTime) % 4 = 0 |
| 64 | +BEGIN |
| 65 | + SET @Event = N'SELECT'; |
| 66 | + SET @TSQL = N'SELECT * FROM ' + @Schema + '.' + @Object |
| 67 | +END |
| 68 | +ELSE IF DATEPART(ms, @PostTime) % 4 = 1 |
| 69 | +BEGIN |
| 70 | + SET @Event = N'INSERT'; |
| 71 | + SET @TSQL = N'INSERT ' + @Schema + '.' + @Object + ' SELECT * FROM ' + @Schema + '.' + @Object |
| 72 | +END |
| 73 | +ELSE IF DATEPART(ms, @PostTime) % 4 = 2 |
| 74 | +BEGIN |
| 75 | + SET @Event = N'UPDATE'; |
| 76 | + SET @TSQL = N'UPDATE ' + @Schema + '.' + @Object + ' SET 1=1'; |
| 77 | +END |
| 78 | +ELSE IF DATEPART(ms, @PostTime) % 4 = 3 |
| 79 | +BEGIN |
| 80 | + SET @Event = N'DELETE'; |
| 81 | + SET @TSQL = N'DELETE FROM ' + @Schema + '.' + @Object + ' WHERE 1=1'; |
| 82 | +END |
| 83 | + |
| 84 | +IF @Optimized = 1 |
| 85 | + INSERT TestSequentialKey_Optimized (PostTime, DatabaseUser, [Event], [Schema], [Object], [TSQL]) |
| 86 | + VALUES (@PostTime, @User, @Event, @Schema, @Object, @TSQL); |
| 87 | +ELSE |
| 88 | + INSERT TestSequentialKey (PostTime, DatabaseUser, [Event], [Schema], [Object], [TSQL]) |
| 89 | + VALUES (@PostTime, @User, @Event, @Schema, @Object, @TSQL); |
| 90 | + |
| 91 | +GO |
0 commit comments