This repository was archived by the owner on Aug 15, 2024. It is now read-only.
-
Notifications
You must be signed in to change notification settings - Fork 129
Improve MsSql append performance #117
Merged
Merged
Changes from all commits
Commits
Show all changes
4 commits
Select commit
Hold shift + click to select a range
5403f11
Replaced query for latest stream position by SCOPE_IDENTITY. Replaced…
yreynhout 0ac04cc
Applied similar changes to ExpectedAny and ExpectedNoStream sql scrip…
yreynhout d7399b7
Fixed an oversight while copy / pasting: when no stream the latest st…
yreynhout 048efb2
Injected the fact there are messages or not as a parameter and made t…
yreynhout File filter
Filter by extension
Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
There are no files selected for viewing
65 changes: 26 additions & 39 deletions
65
src/SqlStreamStore.MsSql/MsSqlScripts/AppendStreamExpectedVersion.sql
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -1,67 +1,54 @@ | ||
| BEGIN TRANSACTION AppendStream; | ||
|
|
||
| DECLARE @streamIdInternal AS INT; | ||
| DECLARE @latestStreamVersion AS INT; | ||
| DECLARE @latestStreamPosition AS BIGINT; | ||
| DECLARE @latestStreamPosition AS BIGINT; | ||
|
|
||
| SELECT @streamIdInternal = dbo.Streams.IdInternal, | ||
| @latestStreamVersion = dbo.Streams.[Version] | ||
| FROM dbo.Streams | ||
| WHERE dbo.Streams.Id = @streamId; | ||
| SELECT @streamIdInternal = dbo.Streams.IdInternal, @latestStreamVersion = dbo.Streams.[Version] | ||
| FROM dbo.Streams WITH (UPDLOCK, ROWLOCK) | ||
| WHERE dbo.Streams.Id = @streamId; | ||
|
|
||
| IF @streamIdInternal IS NULL | ||
| IF @streamIdInternal IS NULL | ||
| BEGIN | ||
| ROLLBACK TRANSACTION AppendStream; | ||
| RAISERROR('WrongExpectedVersion', 16, 1); | ||
| RETURN; | ||
| END | ||
|
|
||
| IF @latestStreamVersion != @expectedStreamVersion | ||
| IF @latestStreamVersion != @expectedStreamVersion | ||
| BEGIN | ||
| ROLLBACK TRANSACTION AppendStream; | ||
| RAISERROR('WrongExpectedVersion', 16, 2); | ||
| RETURN; | ||
| END | ||
|
|
||
| INSERT INTO dbo.Messages (StreamIdInternal, StreamVersion, Id, Created, [Type], JsonData, JsonMetadata) | ||
| SELECT @streamIdInternal, | ||
| StreamVersion + @latestStreamVersion + 1, | ||
| Id, | ||
| Created, | ||
| [Type], | ||
| JsonData, | ||
| JsonMetadata | ||
| FROM @newMessages | ||
| ORDER BY StreamVersion; | ||
| INSERT INTO dbo.Messages | ||
| (StreamIdInternal, StreamVersion, Id, Created, [Type], JsonData, JsonMetadata) | ||
| SELECT @streamIdInternal, StreamVersion + @latestStreamVersion + 1, Id, Created, [Type], JsonData, JsonMetadata | ||
| FROM @newMessages | ||
| ORDER BY StreamVersion; | ||
|
|
||
| SELECT TOP(1) | ||
| @latestStreamVersion = dbo.Messages.StreamVersion, | ||
| @latestStreamPosition = dbo.Messages.Position | ||
| FROM dbo.Messages | ||
| WHERE dbo.Messages.StreamIDInternal = @streamIdInternal | ||
| ORDER BY dbo.Messages.Position DESC | ||
| SET @latestStreamPosition = SCOPE_IDENTITY() | ||
|
|
||
| UPDATE dbo.Streams | ||
| SELECT @latestStreamVersion = MAX(StreamVersion) + @latestStreamVersion + 1 | ||
| FROM @newMessages | ||
|
|
||
| UPDATE dbo.Streams | ||
| SET dbo.Streams.[Version] = @latestStreamVersion, | ||
| dbo.Streams.[Position] = @latestStreamPosition | ||
| WHERE dbo.Streams.IdInternal = @streamIdInternal | ||
| WHERE dbo.Streams.IdInternal = @streamIdInternal | ||
|
|
||
| COMMIT TRANSACTION AppendStream; | ||
|
|
||
| /* Select CurrentVersion, CurrentPosition */ | ||
|
|
||
| SELECT currentVersion = @latestStreamVersion, currentPosition = @latestStreamPosition | ||
| SELECT currentVersion = @latestStreamVersion, currentPosition = @latestStreamPosition | ||
|
|
||
| /* Select Metadata */ | ||
| DECLARE @metadataStreamId as NVARCHAR(42) | ||
| DECLARE @metadataStreamIdInternal as INT | ||
| SET @metadataStreamId = '$$' + @streamId | ||
|
|
||
| SELECT @metadataStreamIdInternal = dbo.Streams.IdInternal | ||
| FROM dbo.Streams | ||
| WHERE dbo.Streams.Id = @metadataStreamId; | ||
|
|
||
| SELECT TOP(1) | ||
| dbo.Messages.JsonData | ||
| FROM dbo.Messages | ||
| WHERE dbo.Messages.StreamIdInternal = @metadataStreamIdInternal | ||
| ORDER BY dbo.Messages.Position DESC; | ||
| SELECT dbo.Messages.JsonData | ||
| FROM dbo.Messages | ||
| WHERE dbo.Messages.Position = ( | ||
| SELECT dbo.Streams.Position | ||
| FROM dbo.Streams | ||
| WHERE dbo.Streams.Id = '$$' + @streamId | ||
| ) |
95 changes: 47 additions & 48 deletions
95
src/SqlStreamStore.MsSql/MsSqlScripts/AppendStreamExpectedVersionAny.sql
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -1,64 +1,63 @@ | ||
| DECLARE @streamIdInternal AS INT; | ||
|
|
||
| BEGIN TRANSACTION CreateStreamIfNotExists; | ||
| IF NOT EXISTS (SELECT * FROM dbo.Streams WITH (UPDLOCK, ROWLOCK, HOLDLOCK) | ||
| WHERE dbo.Streams.Id = @streamId) | ||
| INSERT INTO dbo.Streams (Id, IdOriginal) VALUES (@streamId, @streamIdOriginal); | ||
|
|
||
| IF NOT EXISTS ( | ||
| SELECT * | ||
| FROM dbo.Streams WITH (UPDLOCK, ROWLOCK, HOLDLOCK) | ||
| WHERE dbo.Streams.Id = @streamId | ||
| ) | ||
| INSERT INTO dbo.Streams (Id, IdOriginal) | ||
| VALUES (@streamId, @streamIdOriginal); | ||
|
|
||
| COMMIT TRANSACTION CreateStreamIfNotExists; | ||
|
|
||
| BEGIN TRANSACTION AppendStream; | ||
| DECLARE @latestStreamVersion AS INT; | ||
| DECLARE @latestStreamPosition AS BIGINT; | ||
|
|
||
| SELECT @streamIdInternal = dbo.Streams.IdInternal, | ||
| @latestStreamVersion = dbo.Streams.[Version] | ||
| FROM dbo.Streams WITH (UPDLOCK, ROWLOCK) | ||
| WHERE dbo.Streams.Id = @streamId; | ||
|
|
||
| INSERT INTO dbo.Messages (StreamIdInternal, StreamVersion, Id, Created, [Type], JsonData, JsonMetadata) | ||
| SELECT @streamIdInternal, | ||
| StreamVersion + @latestStreamVersion + 1, | ||
| Id, | ||
| Created, | ||
| [Type], | ||
| JsonData, | ||
| JsonMetadata | ||
| FROM @newMessages | ||
| ORDER BY StreamVersion | ||
|
|
||
| SELECT TOP(1) | ||
| @latestStreamVersion = dbo.Messages.StreamVersion, | ||
| @latestStreamPosition = dbo.Messages.Position | ||
| FROM dbo.Messages | ||
| WHERE dbo.Messages.StreamIDInternal = @streamIdInternal | ||
| ORDER BY dbo.Messages.Position DESC | ||
|
|
||
| IF @latestStreamPosition IS NULL | ||
| SET @latestStreamPosition = -1 | ||
|
|
||
| UPDATE dbo.Streams | ||
| SET dbo.Streams.[Version] = @latestStreamVersion, | ||
| dbo.Streams.[Position] = @latestStreamPosition | ||
| WHERE dbo.Streams.IdInternal = @streamIdInternal | ||
| DECLARE @latestStreamVersion AS INT; | ||
| DECLARE @latestStreamPosition AS BIGINT; | ||
|
|
||
| SELECT @streamIdInternal = dbo.Streams.IdInternal, @latestStreamVersion = dbo.Streams.[Version], @latestStreamPosition = dbo.Streams.[Position] | ||
| FROM dbo.Streams WITH (UPDLOCK, ROWLOCK) | ||
| WHERE dbo.Streams.Id = @streamId; | ||
|
|
||
| IF @hasMessages = 1 | ||
| BEGIN | ||
| INSERT INTO dbo.Messages | ||
| (StreamIdInternal, StreamVersion, Id, Created, [Type], JsonData, JsonMetadata) | ||
| SELECT @streamIdInternal, StreamVersion + @latestStreamVersion + 1, Id, Created, [Type], JsonData, JsonMetadata | ||
| FROM @newMessages | ||
| ORDER BY StreamVersion | ||
|
|
||
| SET @latestStreamPosition = SCOPE_IDENTITY() | ||
|
|
||
| SELECT @latestStreamVersion = MAX(StreamVersion) + @latestStreamVersion + 1 | ||
| FROM @newMessages | ||
| SET @latestStreamVersion = @latestStreamVersion | ||
|
|
||
| UPDATE dbo.Streams | ||
| SET dbo.Streams.[Version] = @latestStreamVersion, | ||
| dbo.Streams.[Position] = @latestStreamPosition | ||
| WHERE dbo.Streams.IdInternal = @streamIdInternal | ||
| END | ||
| ELSE | ||
| BEGIN | ||
| SET @latestStreamPosition = ISNULL(@latestStreamPosition, -1) | ||
| SET @latestStreamVersion = ISNULL(@latestStreamVersion, -1) | ||
| END | ||
|
|
||
| COMMIT TRANSACTION AppendStream; | ||
|
|
||
| /* Select CurrentVersion, CurrentPosition */ | ||
|
|
||
| SELECT currentVersion = @latestStreamVersion, currentPosition = @latestStreamPosition | ||
| SELECT currentVersion = @latestStreamVersion, currentPosition = @latestStreamPosition | ||
|
|
||
| /* Select Metadata */ | ||
| DECLARE @metadataStreamId as NVARCHAR(42) | ||
| DECLARE @metadataStreamIdInternal as INT | ||
| SET @metadataStreamId = '$$' + @streamId | ||
|
|
||
| SELECT @metadataStreamIdInternal = dbo.Streams.IdInternal | ||
| FROM dbo.Streams | ||
| WHERE dbo.Streams.Id = @metadataStreamId; | ||
|
|
||
| SELECT TOP(1) | ||
| dbo.Messages.JsonData | ||
| FROM dbo.Messages | ||
| WHERE dbo.Messages.StreamIdInternal = @metadataStreamIdInternal | ||
| ORDER BY dbo.Messages.Position DESC; | ||
| SELECT dbo.Messages.JsonData | ||
| FROM dbo.Messages | ||
| WHERE dbo.Messages.Position = ( | ||
| SELECT dbo.Streams.Position | ||
| FROM dbo.Streams | ||
| WHERE dbo.Streams.Id = '$$' + @streamId | ||
| ) | ||
90 changes: 44 additions & 46 deletions
90
src/SqlStreamStore.MsSql/MsSqlScripts/AppendStreamExpectedVersionNoStream.sql
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -1,58 +1,56 @@ | ||
| BEGIN TRANSACTION CreateStream; | ||
|
|
||
| DECLARE @streamIdInternal AS INT; | ||
| DECLARE @latestStreamVersion AS INT; | ||
| DECLARE @latestStreamPosition AS BIGINT; | ||
| DECLARE @latestStreamPosition AS BIGINT; | ||
|
|
||
| BEGIN | ||
| INSERT INTO dbo.Streams (Id, IdOriginal) VALUES (@streamId, @streamIdOriginal); | ||
| SELECT @streamIdInternal = SCOPE_IDENTITY(); | ||
|
|
||
| INSERT INTO dbo.Messages (StreamIdInternal, StreamVersion, Id, Created, [Type], JsonData, JsonMetadata) | ||
| SELECT @streamIdInternal, | ||
| StreamVersion, | ||
| Id, | ||
| Created, | ||
| [Type], | ||
| JsonData, | ||
| JsonMetadata | ||
| FROM @newMessages | ||
| ORDER BY StreamVersion; | ||
|
|
||
| SELECT TOP(1) | ||
| @latestStreamVersion = dbo.Messages.StreamVersion, | ||
| @latestStreamPosition = dbo.Messages.Position | ||
| FROM dbo.Messages | ||
| WHERE dbo.Messages.StreamIDInternal = @streamIdInternal | ||
| ORDER BY dbo.Messages.Position DESC | ||
|
|
||
| IF @latestStreamVersion IS NULL | ||
| SET @latestStreamVersion = -1 | ||
|
|
||
| IF @latestStreamPosition IS NULL | ||
| SET @latestStreamPosition = -1 | ||
|
|
||
| UPDATE dbo.Streams | ||
| SET dbo.Streams.[Version] = @latestStreamVersion, | ||
| dbo.Streams.[Position] = @latestStreamPosition | ||
| WHERE dbo.Streams.IdInternal = @streamIdInternal | ||
|
|
||
| INSERT INTO dbo.Streams | ||
| (Id, IdOriginal) | ||
| VALUES | ||
| (@streamId, @streamIdOriginal); | ||
|
|
||
| SET @streamIdInternal = SCOPE_IDENTITY(); | ||
|
|
||
| IF @hasMessages = 1 | ||
| BEGIN | ||
| INSERT INTO dbo.Messages | ||
| (StreamIdInternal, StreamVersion, Id, Created, [Type], JsonData, JsonMetadata) | ||
| SELECT @streamIdInternal, StreamVersion, Id, Created, [Type], JsonData, JsonMetadata | ||
| FROM @newMessages | ||
| ORDER BY StreamVersion; | ||
|
|
||
| SET @latestStreamPosition = SCOPE_IDENTITY() | ||
|
|
||
| SELECT @latestStreamVersion = MAX(StreamVersion) | ||
| FROM @newMessages | ||
|
|
||
| UPDATE dbo.Streams | ||
| SET dbo.Streams.[Version] = @latestStreamVersion, | ||
| dbo.Streams.[Position] = @latestStreamPosition | ||
| WHERE dbo.Streams.IdInternal = @streamIdInternal | ||
| END | ||
| ELSE | ||
| BEGIN | ||
| SET @latestStreamPosition = -1 | ||
| SET @latestStreamVersion = -1 | ||
| END | ||
|
|
||
| END; | ||
|
|
||
| COMMIT TRANSACTION CreateStream; | ||
|
|
||
| /* Select CurrentVersion, CurrentPosition */ | ||
|
|
||
| SELECT currentVersion = @latestStreamVersion, currentPosition = @latestStreamPosition | ||
| SELECT currentVersion = @latestStreamVersion, currentPosition = @latestStreamPosition | ||
|
|
||
| /* Select Metadata */ | ||
| DECLARE @metadataStreamId as NVARCHAR(42) | ||
| DECLARE @metadataStreamIdInternal as INT | ||
| SET @metadataStreamId = '$$' + @streamId | ||
|
|
||
| SELECT @metadataStreamIdInternal = dbo.Streams.IdInternal | ||
| FROM dbo.Streams | ||
| WHERE dbo.Streams.Id = @metadataStreamId; | ||
|
|
||
| SELECT TOP(1) | ||
| dbo.Messages.JsonData | ||
| FROM dbo.Messages | ||
| WHERE dbo.Messages.StreamIdInternal = @metadataStreamIdInternal | ||
| ORDER BY dbo.Messages.Position DESC; | ||
|
|
||
| SELECT dbo.Messages.JsonData | ||
| FROM dbo.Messages | ||
| WHERE dbo.Messages.Position = ( | ||
| SELECT dbo.Streams.Position | ||
| FROM dbo.Streams | ||
| WHERE dbo.Streams.Id = '$$' + @streamId | ||
| ) |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
This line can safely be removed - PR inbound.