Fix quadratic INSERT INTO ... VALUES
sanitisation performance
#33
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.
Fixes appsignal/appsignal-elixir#975. I introduced this bug in #32.
Add simple benchmark tool
Since
#[bench]
is nightly-only, add a simple binary that can bemodified to test the performance of specific queries as needed.
Avoid
Vec::remove
withNone
tokenUsing
Vec::remove(i)
causes then
tokens between positioni
andthe end of the vector to be shifted, which is an
O(n)
operation.When done in a loop, as it is done in our
INSERT INTO ... VALUES
repeated list sanitisation, it makes the overall performance
O(n^2)
.To avoid using
Vec::remove
, implement aToken::None
value thatrepresents a "non-token", a gap to be ignored in the token list.
Replace calls to
Vec::remove(i)
with replacing the token atposition
i
withToken::None
.Replace calls to
Vec::insert
for the same reason -- luckily, whenwe insert a token, it's a replacement for a different token, so it's
possible to rewrite them in that manner. These are rarely done in a
loop, though, so the impact on sanitisation performance is much more
limited.