Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

rowexec: paired joiners to accomplish left joins #54639

Merged
merged 1 commit into from
Sep 29, 2020

Conversation

sumeerbhola
Copy link
Collaborator

@sumeerbhola sumeerbhola commented Sep 22, 2020

The paired joiners are used to accomplish left {outer,semi,anti}
joins when the first joiner will produce false positives (as
known to the optimizer).
Currently, only the invertedJoiner can function as this first
joiner but there is wording in the spec describing how this
could also be useful for join expressions that can't be fully
evaluated on one non-inverted index.

The first joiner outputs an additional bool column representing
a continuation value. This is used to demarcate groups of
consecutive rows output by the first joiner that represent
the same original left row. The first joiner needs to preserve
input row order (the invertedJoiner always does this). The
second joiner is a lookup join and handles these groups in
a special manner. The second join does not need to be order
preserving.

Informs #53576

Prior to this, the way to do:

  • a left outer join with an inverted join is to
    do an inner join with the same ON condition, which is a pair
    of inverted join and lookup join, and then wrap the expression
    in another left join with the original left side.
  • a left anti join with an inverted join is to map it to a left
    outer join (previous bullet).
  • a left semi join is to map it to an inner join with the same
    ON condition, which is a pair of inverted join and lookup
    join, and then project, sort (or make the lookup join order
    preserving) and dedup.

We expect that the alternative outlined in this PR (it excludes
the optimizer changes) will be more efficient since it is
simply a pairing of inverted joiner and lookup join (and the
latter does not need to be order preserving).

Release note: None

@cockroach-teamcity
Copy link
Member

This change is Reviewable

@sumeerbhola
Copy link
Collaborator Author

There are probably bugs here since I have not written any tests (and I see the CI failed). Sent it out just for early comments.

Copy link
Collaborator

@rytaft rytaft left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I didn't review the execution code in a lot of detail -- I'll leave that for @yuzefovich and @asubiotto. But the approach generally looks good to me. Mostly just left a lot of nits in the comments below.

Reviewed 5 of 5 files at r1.
Reviewable status: :shipit: complete! 0 of 0 LGTMs obtained (waiting on @asubiotto, @sumeerbhola, and @yuzefovich)


pkg/sql/execinfrapb/processors_sql.proto, line 202 at r1 (raw file):

// The first join in this pair of joins is unable to precisely evaluate the
// join condition and produces false positives. This is typical when the first
// join is a inverted join (see InvertedJoinerSpec), but can also be the case

[nit] a inverted -> an inverted


pkg/sql/execinfrapb/processors_sql.proto, line 227 at r1 (raw file):

// a1, b2, c1, null, false // when the first join is LEFT_OUTER
// a2, b1, c1, d3,   false
// a2, b2, c1, d4,   true

should this be b1 instead of b2?


pkg/sql/execinfrapb/processors_sql.proto, line 234 at r1 (raw file):

// a1, b1, c1, d1,   null, null
// a1, b2, c1, null, null, null
// a2, b2, c1, d4,   d4,   f1

ditto


pkg/sql/execinfrapb/processors_sql.proto, line 244 at r1 (raw file):

//
// The output for LEFT_SEMI:
// a1, b1, c1, d3

I think this should be a2, b1, c1, d4


pkg/sql/execinfrapb/processors_sql.proto, line 247 at r1 (raw file):

// Again, the d column will be projected away after the join.
//
// This special case is

This got cut off


pkg/sql/execinfrapb/processors_sql.proto, line 568 at r1 (raw file):

// Internal columns for LEFT_SEMI and LEFT_ANTI: | a | b |
//
// For a LEFT_OUTER with OutputGroupCountForLeftJoin = true, the internal

OutputGroupCountForLeftJoin -> OutputContinuationForLeftJoin

Also, doesn't have to be LEFT_OUTER, right? This could also be used with INNER.


pkg/sql/execinfrapb/processors_sql.proto, line 569 at r1 (raw file):

//
// For a LEFT_OUTER with OutputGroupCountForLeftJoin = true, the internal
// columns including an additional bool column as the last column.

including -> include?


pkg/sql/rowexec/inverted_joiner.go, line 145 at r1 (raw file):

	outputContinuationCol bool
	trueEncDatum          rowenc.EncDatum

[nit] Seems a bit odd to have these as data members. Why not just define a global instance within the file var trueEncDatum = rowenc.DatumToEncDatum(types.Bool, tree.DBoolTrue)?


pkg/sql/rowexec/inverted_joiner.go, line 580 at r1 (raw file):

	}
	if renderedRow != nil {
		firstRowForInputIdx := ij.emitCursor.seenMatch

[nit] I don't think this variable really makes it clearer what's going on. I would just use ij.emitCursor.seenMatch below.


pkg/sql/rowexec/inverted_joiner.go, line 604 at r1 (raw file):

}

// renderUnmatchedRow creates a result row given an unmatched row.

[nit] update comment to indicate that the result is stored in ij.combinedRow


pkg/sql/rowexec/joinreader.go, line 50 at r1 (raw file):

	// jrEmittingRows means we are emitting the results of the index lookup.
	jrEmittingRows
	// jrReadyToDrain means we are done but have not yet started draining

[nit] missing period


pkg/sql/rowexec/joinreader.go, line 111 at r1 (raw file):

	// are together implementing left {outer,semi,anti} joins where the
	// first join produces false positives because it cannot evaluate
	// the whole expression (or evaluate it accurately, as in sometimes

as in -> as is


pkg/sql/rowexec/joinreader.go, line 113 at r1 (raw file):

	// the whole expression (or evaluate it accurately, as in sometimes
	// the case with inverted indexes). The first join is running a
	// left outer join, and each group of rows seen by the second join

could also be inner


pkg/sql/rowexec/joinreader_strategies.go, line 249 at r1 (raw file):

		// join, this will emit a row that includes a possibly non-nil value in
		// the lookup columns, which will differ for different rows in a group.
		// These will need to be projected away.

Is this comment supposed to apply to the optimizer? If so, maybe add a TODO.


pkg/sql/rowexec/joinreader_strategies.go, line 286 at r1 (raw file):

			// row that includes a possibly non-nil value in the lookup columns,
			// which will differ for different rows in a group. These will need to
			// be projected away.

ditto


pkg/sql/rowexec/joinreader_strategies.go, line 519 at r1 (raw file):

		// join, this will emit a row that includes a possibly non-nil value in
		// the lookup columns, which will differ for different rows in a group.
		// These will need to be projected away.

ditto

@sumeerbhola sumeerbhola force-pushed the left_join branch 2 times, most recently from fa8e177 to 3287d1f Compare September 23, 2020 14:23
Copy link
Collaborator Author

@sumeerbhola sumeerbhola left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

TFTR!
I've addressed the comments.

I will try to refactor the joinReader code to make these changes look less like two different code paths.

Reviewable status: :shipit: complete! 0 of 0 LGTMs obtained (waiting on @asubiotto, @rytaft, and @yuzefovich)


pkg/sql/execinfrapb/processors_sql.proto, line 202 at r1 (raw file):

Previously, rytaft (Rebecca Taft) wrote…

[nit] a inverted -> an inverted

Done.


pkg/sql/execinfrapb/processors_sql.proto, line 227 at r1 (raw file):

Previously, rytaft (Rebecca Taft) wrote…

should this be b1 instead of b2?

Yes, should be b1. Fixed


pkg/sql/execinfrapb/processors_sql.proto, line 234 at r1 (raw file):

Previously, rytaft (Rebecca Taft) wrote…

ditto

Done


pkg/sql/execinfrapb/processors_sql.proto, line 244 at r1 (raw file):

Previously, rytaft (Rebecca Taft) wrote…

I think this should be a2, b1, c1, d4

Yep -- fixed.


pkg/sql/execinfrapb/processors_sql.proto, line 247 at r1 (raw file):

Previously, rytaft (Rebecca Taft) wrote…

This got cut off

Forgot to delete. Removed.


pkg/sql/execinfrapb/processors_sql.proto, line 568 at r1 (raw file):

Previously, rytaft (Rebecca Taft) wrote…

OutputGroupCountForLeftJoin -> OutputContinuationForLeftJoin

Also, doesn't have to be LEFT_OUTER, right? This could also be used with INNER.

I forgot a number of places to update the count to continuation change, and the expansion to INNER joins.
Done.


pkg/sql/execinfrapb/processors_sql.proto, line 569 at r1 (raw file):

Previously, rytaft (Rebecca Taft) wrote…

including -> include?

Done.


pkg/sql/rowexec/inverted_joiner.go, line 145 at r1 (raw file):

Previously, rytaft (Rebecca Taft) wrote…

[nit] Seems a bit odd to have these as data members. Why not just define a global instance within the file var trueEncDatum = rowenc.DatumToEncDatum(types.Bool, tree.DBoolTrue)?

Done.


pkg/sql/rowexec/inverted_joiner.go, line 580 at r1 (raw file):

Previously, rytaft (Rebecca Taft) wrote…

[nit] I don't think this variable really makes it clearer what's going on. I would just use ij.emitCursor.seenMatch below.

Done.


pkg/sql/rowexec/inverted_joiner.go, line 604 at r1 (raw file):

Previously, rytaft (Rebecca Taft) wrote…

[nit] update comment to indicate that the result is stored in ij.combinedRow

Done.


pkg/sql/rowexec/joinreader.go, line 50 at r1 (raw file):

Previously, rytaft (Rebecca Taft) wrote…

[nit] missing period

Done.


pkg/sql/rowexec/joinreader.go, line 111 at r1 (raw file):

Previously, rytaft (Rebecca Taft) wrote…

as in -> as is

Done.


pkg/sql/rowexec/joinreader.go, line 113 at r1 (raw file):

Previously, rytaft (Rebecca Taft) wrote…

could also be inner

Done.


pkg/sql/rowexec/joinreader_strategies.go, line 249 at r1 (raw file):

Previously, rytaft (Rebecca Taft) wrote…

Is this comment supposed to apply to the optimizer? If so, maybe add a TODO.

Correct. Done.


pkg/sql/rowexec/joinreader_strategies.go, line 286 at r1 (raw file):

Previously, rytaft (Rebecca Taft) wrote…

ditto

Done.


pkg/sql/rowexec/joinreader_strategies.go, line 519 at r1 (raw file):

Previously, rytaft (Rebecca Taft) wrote…

ditto

Done.

Copy link
Collaborator

@rytaft rytaft left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thanks!

Reviewed 5 of 5 files at r2.
Reviewable status: :shipit: complete! 0 of 0 LGTMs obtained (waiting on @asubiotto and @yuzefovich)

Copy link
Member

@yuzefovich yuzefovich left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Overall, the code looks good to me, but it would definitely benefit from some unification and hiding of the complexity, so I'm +1 on "make these changes look less like two different code paths".

Reviewable status: :shipit: complete! 0 of 0 LGTMs obtained (waiting on @asubiotto and @sumeerbhola)


pkg/sql/execinfrapb/processors_sql.proto, line 209 at r1 (raw file):

// lookup columns. The first join additionally adds a continuation column that
// demarcates a group of successive rows that correspond to an original left
// row. The first row in a group contains false (since it is not a

nit: not sure how important this is, but in the vectorized ordered aggregation we have true marking the beginning of a new group and false marking a continuation of the group, so it might be worth switching true and false as well as the naming from "continuation" to "new_group" (or something like that) here to be similar.


pkg/sql/rowexec/joinreader.go, line 122 at r1 (raw file):

	// in the pair.

	// The current batch of input rows belong to groups which are

nit: s/belong/belongs/.


pkg/sql/rowexec/joinreader.go, line 127 at r1 (raw file):

	// don't know if it was the last row in a group until we get
	// to the next batch.
	groupingState                 *inputBatchGroupingState

nit: I'd define a utility struct for these fields, something like

secondJoinUtil struct {
  groupingState ...
  ...
}

I find that such a way hides the complexity a bit better.


pkg/sql/rowexec/joinreader.go, line 469 at r1 (raw file):

) {
	if jr.groupingState != nil {
		if !jr.groupStateReset {

nit: I'd switch the meaning of jr.groupStateReset so that when it is true, then we need to reset (maybe I'd rename the variable slightly as well). I think it reads more natural and we're avoiding a reset at the very beginning (when no rows have been read).


pkg/sql/rowexec/joinreader.go, line 475 at r1 (raw file):

			jr.groupStateReset = true
		}
		// Else, returning meta interrupted reading the input batch, so already

nit: I think s/so already/so we already/ - something seems to be missing.


pkg/sql/rowexec/joinreader.go, line 491 at r2 (raw file):

		}
		jr.curBatchSizeBytes += int64(row.Size())
		if jr.groupingState != nil {

I wonder whether it is possible to refactor these changes to hide the complexity behind some interface. I think you mentioned in a comment that you'll work on that - that'd be great.


pkg/sql/rowexec/joinreader.go, line 500 at r2 (raw file):

			jr.groupingState.addContinuationValForRow(continuationVal)
			if len(jr.scratchInputRows) == 0 && continuationVal {
				// First row in batch is a continuation of last group

nit: missing period.


pkg/sql/rowexec/joinreader.go, line 791 at r2 (raw file):

func (ib *inputBatchGroupingState) addContinuationValForRow(cont bool) {
	if len(ib.groupMatched) == 0 || !cont {

This condition seems a bit suspicious to me, could you add some comments explaining what this method achieves?


pkg/sql/rowexec/joinreader_strategies.go, line 201 at r2 (raw file):

		s.scratchMatchingInputRowIndices = s.scratchMatchingInputRowIndices[:0]
		for _, inputRowIdx := range matchingInputRowIndices {
			if (s.groupingState == nil && !s.matched[inputRowIdx]) ||

I think it'd be nice to unify the two conditions somehow into one - like we would have a "matching" strategy or something that would behave differently when we have the continuation values.


pkg/sql/rowexec/joinreader_strategies.go, line 232 at r2 (raw file):

			s.emitState.unmatchedInputRowIndices = s.emitState.unmatchedInputRowIndices[:0]
			for inputRowIdx, m := range s.matched {
				if (s.groupingState == nil && !m) || s.groupingState.isUnmatched(inputRowIdx) {

ditto for some unification


pkg/sql/rowexec/joinreader_strategies.go, line 260 at r2 (raw file):

		s.emitState.matchingInputRowIndicesCursor++
		inputRow := s.inputRows[inputRowIdx]
		if s.groupingState != nil && s.joinType == descpb.LeftSemiJoin && s.groupingState.getMatched(inputRowIdx) {

nit: it deserves a quick comment.

Copy link
Collaborator Author

@sumeerbhola sumeerbhola left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

TFTR!
Addressed (most) comments and did refactoring to unify the grouping and non-grouping code paths.

I'll come back later to the comment on whether it should be a continuation or new group bool. And I'll work on adding tests.

Reviewable status: :shipit: complete! 0 of 0 LGTMs obtained (waiting on @asubiotto, @rytaft, @sumeerbhola, and @yuzefovich)


pkg/sql/rowexec/joinreader.go, line 122 at r1 (raw file):

Previously, yuzefovich wrote…

nit: s/belong/belongs/.

I switched the noun order since the sentence is really about "The input rows ... belong to groups ...".


pkg/sql/rowexec/joinreader.go, line 127 at r1 (raw file):

Previously, yuzefovich wrote…

nit: I'd define a utility struct for these fields, something like

secondJoinUtil struct {
  groupingState ...
  ...
}

I find that such a way hides the complexity a bit better.

I've moved the last prefixed fields into lastBatchState. groupingState is now used for all lookup joins so I've left it at the top-level.


pkg/sql/rowexec/joinreader.go, line 469 at r1 (raw file):

Previously, yuzefovich wrote…

nit: I'd switch the meaning of jr.groupStateReset so that when it is true, then we need to reset (maybe I'd rename the variable slightly as well). I think it reads more natural and we're avoiding a reset at the very beginning (when no rows have been read).

Done


pkg/sql/rowexec/joinreader.go, line 475 at r1 (raw file):

Previously, yuzefovich wrote…

nit: I think s/so already/so we already/ - something seems to be missing.

Done


pkg/sql/rowexec/joinreader.go, line 491 at r2 (raw file):

Previously, yuzefovich wrote…

I wonder whether it is possible to refactor these changes to hide the complexity behind some interface. I think you mentioned in a comment that you'll work on that - that'd be great.

I've tried to manage the groupingState initialization complexity by putting some of it in methods on inputBatchGroupingState. I'd like to note that all the initialization happens in this method so its not spread in various places (if that helps).

The comment I'd said earlier was mainly about different code paths in the strategies implementation -- the matching state was being kept in 2 different ways. That's been simplified by using inputBatchGroupingState for matching information whether or not grouping is being done.


pkg/sql/rowexec/joinreader.go, line 500 at r2 (raw file):

Previously, yuzefovich wrote…

nit: missing period.

Done


pkg/sql/rowexec/joinreader.go, line 791 at r2 (raw file):

Previously, yuzefovich wrote…

This condition seems a bit suspicious to me, could you add some comments explaining what this method achieves?

I've added a comment. Note that if cont is true for the first row in a batch, we still need to place an entry for group num 0 in these slices. The matching state of group num 0 will get updated later by calling setFirstGroupMatched.


pkg/sql/rowexec/joinreader_strategies.go, line 201 at r2 (raw file):

Previously, yuzefovich wrote…

I think it'd be nice to unify the two conditions somehow into one - like we would have a "matching" strategy or something that would behave differently when we have the continuation values.

Ack. The matched field is no more.


pkg/sql/rowexec/joinreader_strategies.go, line 232 at r2 (raw file):

Previously, yuzefovich wrote…

ditto for some unification

Done


pkg/sql/rowexec/joinreader_strategies.go, line 260 at r2 (raw file):

Previously, yuzefovich wrote…

nit: it deserves a quick comment.

Done

@sumeerbhola sumeerbhola changed the title [WIP] rowexec: paired joiners to accomplish left joins rowexec: paired joiners to accomplish left joins Sep 23, 2020
@sumeerbhola sumeerbhola force-pushed the left_join branch 2 times, most recently from 2a575a2 to 104d174 Compare September 24, 2020 01:59
Copy link
Collaborator Author

@sumeerbhola sumeerbhola left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Added tests.

Reviewable status: :shipit: complete! 0 of 0 LGTMs obtained (waiting on @asubiotto, @rytaft, @sumeerbhola, and @yuzefovich)

Copy link
Member

@yuzefovich yuzefovich left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Reviewed 7 of 7 files at r3.
Reviewable status: :shipit: complete! 0 of 0 LGTMs obtained (waiting on @asubiotto and @sumeerbhola)


pkg/sql/execinfrapb/processors_sql.proto, line 209 at r1 (raw file):

Previously, yuzefovich wrote…

nit: not sure how important this is, but in the vectorized ordered aggregation we have true marking the beginning of a new group and false marking a continuation of the group, so it might be worth switching true and false as well as the naming from "continuation" to "new_group" (or something like that) here to be similar.

Actually, I don't think it's too important to unify this with the vectorized engine, up to you.


pkg/sql/execinfrapb/processors_sql.proto, line 620 at r3 (raw file):

  // indicates whether a row is a continuation of a group corresponding to a
  // left row.
  optional bool output_group_continuation_for_left_row = 8 [(gogoproto.nullable) = false];

I'm assuming that this won't be backported, right?

We should bump the distsql version in pkg/sql/execinfra/version.go.


pkg/sql/rowexec/inverted_joiner.go, line 643 at r3 (raw file):

func (ij *invertedJoiner) renderUnmatchedRow(row rowenc.EncDatumRow) {
	ij.combinedRow = append(ij.combinedRow[:0], row...)
	rowLen := cap(ij.combinedRow)

Why are we using cap here and not len?


pkg/sql/rowexec/inverted_joiner.go, line 645 at r3 (raw file):

	rowLen := cap(ij.combinedRow)
	if ij.outputContinuationCol {
		rowLen--

nit: I'd remove rowLen entirely and move the slicing operation into the if, i.e.

ij.combinedRow = append(ij.combinedRow[:0], row...)
if ij.outputContinuationCol {
  ij.combinedRow = ij.combinedRow[:len(row)-1]
}

pkg/sql/rowexec/inverted_joiner_test.go, line 269 at r3 (raw file):

			outputColumns:                 []uint32{0, 1},
			expected:                      "[[5 5] [5 50] [20 2] [20 20] [42 24] [42 42]]",
			outputColumnsWithContinuation: []uint32{0, 1, 4},

nit: looks like we can remove outputColumnsWithContinuation since we can deduce its contents based on outputColumns and outputTypes. The fact whether expectedWithContinuation is empty or not could indicate whether we want to test the continuation case.


pkg/sql/rowexec/joinreader.go, line 491 at r2 (raw file):

Previously, sumeerbhola wrote…

I've tried to manage the groupingState initialization complexity by putting some of it in methods on inputBatchGroupingState. I'd like to note that all the initialization happens in this method so its not spread in various places (if that helps).

The comment I'd said earlier was mainly about different code paths in the strategies implementation -- the matching state was being kept in 2 different ways. That's been simplified by using inputBatchGroupingState for matching information whether or not grouping is being done.

Hm, I think I'd like to see the opposite - having several new methods on groupingState like processingContinuation and finishNewBatch or alike which would contain the new code additions.

As it is written currently, readInput contains a lot of code that is not relevant to the majority of the use cases of the join reader, so I'd like to hide that code if possible.

I wonder what @asubiotto thinks about it.


pkg/sql/rowexec/joinreader_test.go, line 467 at r3 (raw file):

		},
		{
			description: "Test paired join with outer join with group spanning batches",

How do we know a group is spanning multiple batches? Do we have a constant 10 used somewhere?

Copy link
Collaborator Author

@sumeerbhola sumeerbhola left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Reviewable status: :shipit: complete! 0 of 0 LGTMs obtained (waiting on @asubiotto and @yuzefovich)


pkg/sql/execinfrapb/processors_sql.proto, line 209 at r1 (raw file):

Previously, yuzefovich wrote…

Actually, I don't think it's too important to unify this with the vectorized engine, up to you.

Then I'll leave it unchanged.


pkg/sql/execinfrapb/processors_sql.proto, line 620 at r3 (raw file):

Previously, yuzefovich wrote…

I'm assuming that this won't be backported, right?

We should bump the distsql version in pkg/sql/execinfra/version.go.

Yes, won't be backported. I've bumped both Version and MinAcceptedVersion though I'm murky on how this versioning works:

  • These paired joiners won't be used until we add optimizer support for them. Will I need to do anything with versions when adding that code, or just the version compatibility check in FlowVerIsCompatible will take care of the right thing?
  • If FlowVerIsCompatible indicates that the node is on an older version, will the query fail? What prevents the optimizer from constructing such a join before all nodes are on the version that can handle it?
  • Perhaps I shouldn't be bumping up MinAcceptedVersion -- a node that understands this paired joiner stuff can also accept queries from nodes that don't.

Feel free to direct me to some doc that I can read to answer these questions.


pkg/sql/rowexec/inverted_joiner.go, line 643 at r3 (raw file):

Previously, yuzefovich wrote…

Why are we using cap here and not len?

row is just the left side. The right side needs to be added and set to NULL. I've added some code comments.


pkg/sql/rowexec/inverted_joiner.go, line 645 at r3 (raw file):

Previously, yuzefovich wrote…

nit: I'd remove rowLen entirely and move the slicing operation into the if, i.e.

ij.combinedRow = append(ij.combinedRow[:0], row...)
if ij.outputContinuationCol {
  ij.combinedRow = ij.combinedRow[:len(row)-1]
}

See previous comment.


pkg/sql/rowexec/inverted_joiner_test.go, line 269 at r3 (raw file):

Previously, yuzefovich wrote…

nit: looks like we can remove outputColumnsWithContinuation since we can deduce its contents based on outputColumns and outputTypes. The fact whether expectedWithContinuation is empty or not could indicate whether we want to test the continuation case.

Yes, with these test cases it is always column 4 that is the continuation column. Done.


pkg/sql/rowexec/joinreader.go, line 491 at r2 (raw file):

Previously, yuzefovich wrote…

Hm, I think I'd like to see the opposite - having several new methods on groupingState like processingContinuation and finishNewBatch or alike which would contain the new code additions.

As it is written currently, readInput contains a lot of code that is not relevant to the majority of the use cases of the join reader, so I'd like to hide that code if possible.

I wonder what @asubiotto thinks about it.

I didn't enhance groupingState, since we need to update groupingState (which is used by the strategies) and lastBatchState. Instead, I added some helper methods on joinReader and call those instead.
I'm not sure this actually improves readability -- personally I find separating into different functions useful when there is a clean data-structure or algorithmic separation. Here we have to make a bunch of state transitions during initialization that need to occur in a certain order and often being able to read the code in sequence without having to jump around to other functions is easier.
Let me know if you have a better abstraction boundary.


pkg/sql/rowexec/joinreader_test.go, line 467 at r3 (raw file):

Previously, yuzefovich wrote…

How do we know a group is spanning multiple batches? Do we have a constant 10 used somewhere?

It is because we do SetBatchSizeBytes(int64(encRows[0].Size() * 2)) below. I've added a comment.

Copy link
Collaborator

@rytaft rytaft left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Reviewed 3 of 7 files at r3, 5 of 5 files at r4.
Reviewable status: :shipit: complete! 0 of 0 LGTMs obtained (waiting on @asubiotto, @sumeerbhola, and @yuzefovich)


pkg/sql/rowexec/inverted_joiner_test.go, line 240 at r4 (raw file):

		outputTypes []*types.T
		// The output columns for the case without continuation. The test adds
		// column 4 for the case with continuation.

is it always column 4? this comment seems like it will quickly become stale


pkg/sql/rowexec/inverted_joiner_test.go, line 496 at r4 (raw file):

				post := c.post
				if outputGroupContinuation {
					post.OutputColumns = append(c.outputColumns, 4)

[nit] add a comment to explain why it's column 4

Copy link
Member

@yuzefovich yuzefovich left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Reviewed 4 of 5 files at r4.
Reviewable status: :shipit: complete! 0 of 0 LGTMs obtained (waiting on @asubiotto and @sumeerbhola)


pkg/sql/execinfra/version.go, line 46 at r4 (raw file):

// MinAcceptedVersion is the oldest version that the server is compatible with.
// A server will not accept flows with older versions.
const MinAcceptedVersion execinfrapb.DistSQLVersion = 38

As discussed below, no need to bump MinAcceptedVersion.


pkg/sql/execinfrapb/processors_sql.proto, line 620 at r3 (raw file):

Previously, sumeerbhola wrote…

Yes, won't be backported. I've bumped both Version and MinAcceptedVersion though I'm murky on how this versioning works:

  • These paired joiners won't be used until we add optimizer support for them. Will I need to do anything with versions when adding that code, or just the version compatibility check in FlowVerIsCompatible will take care of the right thing?
  • If FlowVerIsCompatible indicates that the node is on an older version, will the query fail? What prevents the optimizer from constructing such a join before all nodes are on the version that can handle it?
  • Perhaps I shouldn't be bumping up MinAcceptedVersion -- a node that understands this paired joiner stuff can also accept queries from nodes that don't.

Feel free to direct me to some doc that I can read to answer these questions.

  • The fact the optimizer doesn't support these paired joiners yet is somewhat irrelevant - we have added a new behavior to "DistSQL server", so we should update it's version.
  • No, the query will not fail; instead, the gateway will not schedule any work on the nodes with newer versions. There is no protection about the optimizer versioning, but the assumption is that on the gateway node if the optimizer constructs a paired joiner, then the gateway is capable of executing it whereas some of the remote nodes might not support it yet - in that case, those remote nodes will not have anything scheduled on them.
  • Yeah, bumping MinAcceptedVersion is not necessary because this change is backwards-compatible (if we have a gateway with old version, then it doesn't know about paired joiners, so it will not try to use such machinery, and - I believe - the remote node with the new version will do exactly what the gateway expects.

pkg/sql/rowexec/inverted_joiner.go, line 643 at r3 (raw file):

Previously, sumeerbhola wrote…

row is just the left side. The right side needs to be added and set to NULL. I've added some code comments.

Ok, makes sense, but I still think it's a bit confusing. How about we move the logic of this part

if ij.outputContinuationCol {
	ij.combinedRow = append(ij.combinedRow, falseEncDatum)
}

into this method? I.e.:

ij.combinedRow = ij.combinedRow[:cap(ij.combinedRow)]
copy(ij.combinedRow, row)
for i := len(row); i < len(ij.combinedRow); i++ {
  ij.combinedRow[i].Datum = tree.DNull
}
if ij.outputContinuationCol {
  ij.combinedRow[len(ij.combinedRow)-1] = falseEncDatum
}

I think this way all the logic for "rendering an unmatched row" is truly in renderUnmatchedRow method.


pkg/sql/rowexec/joinreader.go, line 491 at r2 (raw file):

Previously, sumeerbhola wrote…

I didn't enhance groupingState, since we need to update groupingState (which is used by the strategies) and lastBatchState. Instead, I added some helper methods on joinReader and call those instead.
I'm not sure this actually improves readability -- personally I find separating into different functions useful when there is a clean data-structure or algorithmic separation. Here we have to make a bunch of state transitions during initialization that need to occur in a certain order and often being able to read the code in sequence without having to jump around to other functions is easier.
Let me know if you have a better abstraction boundary.

I don't have a good suggestion for some abstractions, but I think I prefer the current code layout since those methods are pretty much no-ops for the common case (of regular lookup/index joins), so the complexity of the paired joiner case is moved out of the view. Let's see what @asubiotto thinks as the deciding vote :)

Copy link
Member

@yuzefovich yuzefovich left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Also, it'd be nice to run the micro benchmarks to make sure that non-paired joiner case doesn't regress.

Reviewable status: :shipit: complete! 0 of 0 LGTMs obtained (waiting on @asubiotto and @sumeerbhola)

Copy link
Collaborator Author

@sumeerbhola sumeerbhola left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Reviewable status: :shipit: complete! 0 of 0 LGTMs obtained (waiting on @asubiotto, @rytaft, and @yuzefovich)


pkg/sql/execinfra/version.go, line 46 at r4 (raw file):

Previously, yuzefovich wrote…

As discussed below, no need to bump MinAcceptedVersion.

Done.


pkg/sql/execinfrapb/processors_sql.proto, line 620 at r3 (raw file):

Previously, yuzefovich wrote…
  • The fact the optimizer doesn't support these paired joiners yet is somewhat irrelevant - we have added a new behavior to "DistSQL server", so we should update it's version.
  • No, the query will not fail; instead, the gateway will not schedule any work on the nodes with newer versions. There is no protection about the optimizer versioning, but the assumption is that on the gateway node if the optimizer constructs a paired joiner, then the gateway is capable of executing it whereas some of the remote nodes might not support it yet - in that case, those remote nodes will not have anything scheduled on them.
  • Yeah, bumping MinAcceptedVersion is not necessary because this change is backwards-compatible (if we have a gateway with old version, then it doesn't know about paired joiners, so it will not try to use such machinery, and - I believe - the remote node with the new version will do exactly what the gateway expects.

Got it. Thanks.


pkg/sql/rowexec/inverted_joiner.go, line 643 at r3 (raw file):

Previously, yuzefovich wrote…

Ok, makes sense, but I still think it's a bit confusing. How about we move the logic of this part

if ij.outputContinuationCol {
	ij.combinedRow = append(ij.combinedRow, falseEncDatum)
}

into this method? I.e.:

ij.combinedRow = ij.combinedRow[:cap(ij.combinedRow)]
copy(ij.combinedRow, row)
for i := len(row); i < len(ij.combinedRow); i++ {
  ij.combinedRow[i].Datum = tree.DNull
}
if ij.outputContinuationCol {
  ij.combinedRow[len(ij.combinedRow)-1] = falseEncDatum
}

I think this way all the logic for "rendering an unmatched row" is truly in renderUnmatchedRow method.

Yes, that is better. Done.


pkg/sql/rowexec/inverted_joiner_test.go, line 240 at r4 (raw file):

Previously, rytaft (Rebecca Taft) wrote…

is it always column 4? this comment seems like it will quickly become stale

I've adjusted the comment to not say the column number.


pkg/sql/rowexec/inverted_joiner_test.go, line 496 at r4 (raw file):

Previously, rytaft (Rebecca Taft) wrote…

[nit] add a comment to explain why it's column 4

Done.


pkg/sql/rowexec/joinreader.go, line 491 at r2 (raw file):

Previously, yuzefovich wrote…

I don't have a good suggestion for some abstractions, but I think I prefer the current code layout since those methods are pretty much no-ops for the common case (of regular lookup/index joins), so the complexity of the paired joiner case is moved out of the view. Let's see what @asubiotto thinks as the deciding vote :)

Ack.

Copy link
Collaborator

@rytaft rytaft left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

:lgtm: once you address @yuzefovich's comments

Reviewed 3 of 3 files at r5.
Reviewable status: :shipit: complete! 1 of 0 LGTMs obtained (waiting on @asubiotto and @yuzefovich)

Copy link
Member

@yuzefovich yuzefovich left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

:lgtm: if the benchmarks don't show a regression in performance in non-paired case.

Reviewable status: :shipit: complete! 2 of 0 LGTMs obtained (waiting on @asubiotto)

Copy link
Collaborator Author

@sumeerbhola sumeerbhola left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Also, it'd be nice to run the micro benchmarks to make sure that non-paired joiner case doesn't regress.

I am running these and trying to see if the difference is noise or something real.

Reviewable status: :shipit: complete! 0 of 0 LGTMs obtained (and 2 stale) (waiting on @asubiotto)

The paired joiners are used to accomplish left {outer,semi,anti}
joins when the first joiner will produce false positives (as
known to the optimizer).
Currently, only the invertedJoiner can function as this first
joiner but there is wording in the spec describing how this
could also be useful for join expressions that can't be fully
evaluated on one non-inverted index.

The first joiner outputs an additional bool column representing
a continuation value. This is used to demarcate groups of
consecutive rows output by the first joiner that represent
the same original left row. The first joiner needs to preserve
input row order (the invertedJoiner always does this). The
second joiner is a lookup join and handles these groups in
a special manner. The second join does not need to be order
preserving.

Informs cockroachdb#53576

Prior to this, the way to do:
- a left outer join with an inverted join is to
  do an inner join with the same ON condition, which is a pair
  of inverted join and lookup join, and then wrap the expression
  in another left join with the original left side.
- a left anti join with an inverted join is to map it to a left
  outer join (previous bullet).
- a left semi join is to map it to an inner join with the same
  ON condition, which is a pair of inverted join and lookup
  join, and then project, sort (or make the lookup join order
  preserving) and dedup.

We expect that the alternative outlined in this PR (it excludes
the optimizer changes) will be more efficient since it is
simply a pairing of inverted joiner and lookup join (and the
latter does not need to be order preserving).

Release note: None
Copy link
Collaborator Author

@sumeerbhola sumeerbhola left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@yuzefovich I've made some changes to shave off some allocations that were showing up in profiles.

There isn't a regression (see full diff below: old is master and new is this PR), and I did look at mem profiles for the small mem diffs below but there isn't really anything in the profiles corresponding to the new path so I think the diffs there are just noise.

name                                                                                                old time/op    new time/op     delta
JoinReader/reqOrdering=true/matchratio=onetoone/lookuprows=1/mem=100KB/parallel=true-16               46.2µs ± 8%     40.8µs ± 0%  -11.52%  (p=0.016 n=5+4)
JoinReader/reqOrdering=true/matchratio=onetoone/lookuprows=1/mem=100KB-16                             45.0µs ± 5%     42.0µs ± 2%   -6.75%  (p=0.008 n=5+5)
JoinReader/reqOrdering=true/matchratio=onetoone/lookuprows=1/mem=unlimited/parallel=true-16           44.8µs ± 4%     42.6µs ±12%     ~     (p=0.151 n=5+5)
JoinReader/reqOrdering=true/matchratio=onetoone/lookuprows=1/mem=unlimited-16                         44.1µs ± 2%     40.9µs ± 1%   -7.29%  (p=0.008 n=5+5)
JoinReader/reqOrdering=true/matchratio=onetoone/lookuprows=16/mem=100KB-16                             125µs ± 3%      114µs ± 1%   -8.85%  (p=0.008 n=5+5)
JoinReader/reqOrdering=true/matchratio=onetoone/lookuprows=16/mem=unlimited-16                         125µs ± 1%      114µs ± 3%   -8.58%  (p=0.008 n=5+5)
JoinReader/reqOrdering=true/matchratio=onetoone/lookuprows=256/mem=100KB-16                           1.41ms ± 2%     1.28ms ± 2%   -9.40%  (p=0.008 n=5+5)
JoinReader/reqOrdering=true/matchratio=onetoone/lookuprows=256/mem=unlimited-16                       1.40ms ± 1%     1.28ms ± 1%   -8.21%  (p=0.016 n=4+5)
JoinReader/reqOrdering=true/matchratio=onetoone/lookuprows=1024/mem=100KB-16                          5.60ms ± 3%     5.13ms ± 3%   -8.47%  (p=0.008 n=5+5)
JoinReader/reqOrdering=true/matchratio=onetoone/lookuprows=1024/mem=unlimited-16                      5.65ms ± 5%     5.12ms ± 3%   -9.39%  (p=0.008 n=5+5)
JoinReader/reqOrdering=true/matchratio=onetoone/lookuprows=4096/mem=100KB-16                          22.1ms ± 2%     19.9ms ± 2%  -10.00%  (p=0.008 n=5+5)
JoinReader/reqOrdering=true/matchratio=onetoone/lookuprows=4096/mem=unlimited-16                      22.3ms ± 2%     19.8ms ± 2%  -11.33%  (p=0.008 n=5+5)
JoinReader/reqOrdering=true/matchratio=onetoone/lookuprows=8192/mem=100KB-16                          44.8ms ± 3%     40.9ms ±11%   -8.63%  (p=0.032 n=5+5)
JoinReader/reqOrdering=true/matchratio=onetoone/lookuprows=8192/mem=unlimited-16                      44.5ms ± 3%     40.7ms ± 2%   -8.53%  (p=0.008 n=5+5)
JoinReader/reqOrdering=true/matchratio=onetoone/lookuprows=16384/mem=100KB-16                         80.8ms ± 3%     72.0ms ± 4%  -10.95%  (p=0.008 n=5+5)
JoinReader/reqOrdering=true/matchratio=onetoone/lookuprows=16384/mem=unlimited-16                     81.2ms ± 5%     71.1ms ± 1%  -12.38%  (p=0.008 n=5+5)
JoinReader/reqOrdering=true/matchratio=onetoone/lookuprows=32768/mem=100KB-16                          160ms ± 2%      153ms ± 6%     ~     (p=0.222 n=5+5)
JoinReader/reqOrdering=true/matchratio=onetoone/lookuprows=32768/mem=unlimited-16                      162ms ± 5%      149ms ±11%     ~     (p=0.095 n=5+5)
JoinReader/reqOrdering=true/matchratio=onetoone/lookuprows=65536/mem=100KB-16                          324ms ± 4%      290ms ± 4%  -10.61%  (p=0.008 n=5+5)
JoinReader/reqOrdering=true/matchratio=onetoone/lookuprows=65536/mem=unlimited-16                      327ms ± 6%      289ms ± 3%  -11.47%  (p=0.008 n=5+5)
JoinReader/reqOrdering=true/matchratio=onetoone/lookuprows=524288/mem=100KB-16                         2.58s ± 4%      2.28s ± 2%  -11.78%  (p=0.008 n=5+5)
JoinReader/reqOrdering=true/matchratio=onetoone/lookuprows=524288/mem=unlimited-16                     2.57s ± 1%      2.29s ± 1%  -10.94%  (p=0.008 n=5+5)
JoinReader/reqOrdering=true/matchratio=onetofour/lookuprows=1/mem=100KB/parallel=true-16              45.0µs ± 2%     42.6µs ± 2%   -5.38%  (p=0.008 n=5+5)
JoinReader/reqOrdering=true/matchratio=onetofour/lookuprows=1/mem=100KB-16                            45.1µs ± 1%     42.5µs ± 2%   -5.74%  (p=0.008 n=5+5)
JoinReader/reqOrdering=true/matchratio=onetofour/lookuprows=1/mem=unlimited/parallel=true-16          45.7µs ± 2%     42.9µs ± 3%   -6.04%  (p=0.008 n=5+5)
JoinReader/reqOrdering=true/matchratio=onetofour/lookuprows=1/mem=unlimited-16                        45.3µs ± 1%     44.1µs ± 4%     ~     (p=0.095 n=5+5)
JoinReader/reqOrdering=true/matchratio=onetofour/lookuprows=16/mem=100KB-16                            148µs ± 1%      152µs ± 4%     ~     (p=0.190 n=4+5)
JoinReader/reqOrdering=true/matchratio=onetofour/lookuprows=16/mem=unlimited-16                        157µs ± 5%      147µs ± 8%     ~     (p=0.056 n=5+5)
JoinReader/reqOrdering=true/matchratio=onetofour/lookuprows=256/mem=100KB-16                          1.81ms ± 4%     1.76ms ± 4%     ~     (p=0.095 n=5+5)
JoinReader/reqOrdering=true/matchratio=onetofour/lookuprows=256/mem=unlimited-16                      1.81ms ± 3%     1.74ms ± 4%   -4.33%  (p=0.032 n=5+5)
JoinReader/reqOrdering=true/matchratio=onetofour/lookuprows=1024/mem=100KB-16                         7.04ms ± 2%     6.88ms ± 3%     ~     (p=0.151 n=5+5)
JoinReader/reqOrdering=true/matchratio=onetofour/lookuprows=1024/mem=unlimited-16                     7.09ms ± 4%     6.77ms ± 1%   -4.41%  (p=0.016 n=5+5)
JoinReader/reqOrdering=true/matchratio=onetofour/lookuprows=4096/mem=100KB-16                         27.8ms ± 2%     27.6ms ± 4%     ~     (p=0.548 n=5+5)
JoinReader/reqOrdering=true/matchratio=onetofour/lookuprows=4096/mem=unlimited-16                     27.8ms ± 3%     26.8ms ± 3%     ~     (p=0.056 n=5+5)
JoinReader/reqOrdering=true/matchratio=onetofour/lookuprows=8192/mem=100KB-16                         58.3ms ±16%     54.5ms ± 2%     ~     (p=0.095 n=5+5)
JoinReader/reqOrdering=true/matchratio=onetofour/lookuprows=8192/mem=unlimited-16                     56.3ms ± 2%     54.8ms ± 5%     ~     (p=0.151 n=5+5)
JoinReader/reqOrdering=true/matchratio=onetofour/lookuprows=16384/mem=100KB-16                         113ms ± 2%      105ms ± 2%   -7.24%  (p=0.008 n=5+5)
JoinReader/reqOrdering=true/matchratio=onetofour/lookuprows=16384/mem=unlimited-16                     110ms ± 3%      111ms ± 5%     ~     (p=0.421 n=5+5)
JoinReader/reqOrdering=true/matchratio=onetofour/lookuprows=32768/mem=100KB-16                         219ms ± 3%      221ms ± 3%     ~     (p=0.421 n=5+5)
JoinReader/reqOrdering=true/matchratio=onetofour/lookuprows=32768/mem=unlimited-16                     222ms ± 3%      216ms ± 6%     ~     (p=0.151 n=5+5)
JoinReader/reqOrdering=true/matchratio=onetofour/lookuprows=65536/mem=100KB-16                         444ms ± 2%      430ms ± 4%     ~     (p=0.056 n=5+5)
JoinReader/reqOrdering=true/matchratio=onetofour/lookuprows=65536/mem=unlimited-16                     442ms ± 3%      431ms ± 3%     ~     (p=0.151 n=5+5)
JoinReader/reqOrdering=true/matchratio=onetosixteen/lookuprows=1/mem=100KB/parallel=true-16           56.0µs ± 7%     51.0µs ± 6%   -9.01%  (p=0.032 n=5+5)
JoinReader/reqOrdering=true/matchratio=onetosixteen/lookuprows=1/mem=100KB-16                         54.2µs ± 6%     50.1µs ± 2%   -7.45%  (p=0.008 n=5+5)
JoinReader/reqOrdering=true/matchratio=onetosixteen/lookuprows=1/mem=unlimited/parallel=true-16       53.9µs ± 3%     50.7µs ± 4%   -6.08%  (p=0.008 n=5+5)
JoinReader/reqOrdering=true/matchratio=onetosixteen/lookuprows=1/mem=unlimited-16                     55.3µs ± 6%     50.2µs ± 4%   -9.16%  (p=0.016 n=5+5)
JoinReader/reqOrdering=true/matchratio=onetosixteen/lookuprows=16/mem=100KB-16                         284µs ±10%      256µs ± 2%  -10.01%  (p=0.008 n=5+5)
JoinReader/reqOrdering=true/matchratio=onetosixteen/lookuprows=16/mem=unlimited-16                     268µs ± 3%      258µs ± 3%   -3.63%  (p=0.032 n=5+5)
JoinReader/reqOrdering=true/matchratio=onetosixteen/lookuprows=256/mem=100KB-16                       7.79ms ± 6%     7.40ms ± 2%   -5.07%  (p=0.008 n=5+5)
JoinReader/reqOrdering=true/matchratio=onetosixteen/lookuprows=256/mem=unlimited-16                   3.55ms ± 2%     3.45ms ± 2%   -2.69%  (p=0.032 n=5+5)
JoinReader/reqOrdering=true/matchratio=onetosixteen/lookuprows=1024/mem=100KB-16                      31.2ms ±11%     29.2ms ± 1%   -6.61%  (p=0.032 n=5+5)
JoinReader/reqOrdering=true/matchratio=onetosixteen/lookuprows=1024/mem=unlimited-16                  14.0ms ± 3%     13.9ms ± 2%     ~     (p=0.421 n=5+5)
JoinReader/reqOrdering=true/matchratio=onetosixteen/lookuprows=4096/mem=100KB-16                       120ms ± 4%      116ms ± 2%     ~     (p=0.056 n=5+5)
JoinReader/reqOrdering=true/matchratio=onetosixteen/lookuprows=4096/mem=unlimited-16                  59.6ms ± 5%     54.3ms ± 2%   -8.87%  (p=0.008 n=5+5)
JoinReader/reqOrdering=true/matchratio=onetosixteen/lookuprows=8192/mem=100KB-16                       242ms ± 5%      234ms ± 2%     ~     (p=0.095 n=5+5)
JoinReader/reqOrdering=true/matchratio=onetosixteen/lookuprows=8192/mem=unlimited-16                   111ms ± 1%      110ms ± 3%     ~     (p=0.690 n=5+5)
JoinReader/reqOrdering=true/matchratio=onetosixteen/lookuprows=16384/mem=100KB-16                      479ms ± 2%      464ms ± 1%   -3.17%  (p=0.016 n=5+5)
JoinReader/reqOrdering=true/matchratio=onetosixteen/lookuprows=16384/mem=unlimited-16                  225ms ± 2%      214ms ± 2%   -4.65%  (p=0.008 n=5+5)
JoinReader/reqOrdering=true/matchratio=onetosixteen/lookuprows=32768/mem=100KB-16                      1.04s ±12%      0.94s ± 2%  -10.15%  (p=0.008 n=5+5)
JoinReader/reqOrdering=true/matchratio=onetosixteen/lookuprows=32768/mem=unlimited-16                  451ms ± 3%      434ms ± 2%   -3.75%  (p=0.008 n=5+5)
JoinReader/reqOrdering=true/matchratio=onetothirtytwo/lookuprows=1/mem=100KB/parallel=true-16         62.6µs ± 6%     58.5µs ± 1%   -6.63%  (p=0.008 n=5+5)
JoinReader/reqOrdering=true/matchratio=onetothirtytwo/lookuprows=1/mem=100KB-16                       61.0µs ± 3%     60.8µs ±12%     ~     (p=0.222 n=5+5)
JoinReader/reqOrdering=true/matchratio=onetothirtytwo/lookuprows=1/mem=unlimited/parallel=true-16     65.5µs ± 5%     58.5µs ± 2%  -10.65%  (p=0.008 n=5+5)
JoinReader/reqOrdering=true/matchratio=onetothirtytwo/lookuprows=1/mem=unlimited-16                   66.2µs ±13%     59.4µs ± 2%  -10.33%  (p=0.008 n=5+5)
JoinReader/reqOrdering=true/matchratio=onetothirtytwo/lookuprows=16/mem=100KB-16                       427µs ± 1%      410µs ± 2%   -4.00%  (p=0.008 n=5+5)
JoinReader/reqOrdering=true/matchratio=onetothirtytwo/lookuprows=16/mem=unlimited-16                   432µs ± 5%      401µs ± 2%   -7.01%  (p=0.008 n=5+5)
JoinReader/reqOrdering=true/matchratio=onetothirtytwo/lookuprows=256/mem=100KB-16                     13.5ms ± 2%     13.3ms ± 2%     ~     (p=0.222 n=5+5)
JoinReader/reqOrdering=true/matchratio=onetothirtytwo/lookuprows=256/mem=unlimited-16                 5.90ms ± 3%     5.75ms ± 3%     ~     (p=0.310 n=5+5)
JoinReader/reqOrdering=true/matchratio=onetothirtytwo/lookuprows=1024/mem=100KB-16                    54.5ms ± 4%     52.3ms ± 3%   -3.99%  (p=0.032 n=5+5)
JoinReader/reqOrdering=true/matchratio=onetothirtytwo/lookuprows=1024/mem=unlimited-16                23.6ms ± 6%     22.8ms ± 2%     ~     (p=0.056 n=5+5)
JoinReader/reqOrdering=true/matchratio=onetothirtytwo/lookuprows=4096/mem=100KB-16                     212ms ± 2%      211ms ± 1%     ~     (p=0.548 n=5+5)
JoinReader/reqOrdering=true/matchratio=onetothirtytwo/lookuprows=4096/mem=unlimited-16                92.7ms ± 6%     90.0ms ± 2%     ~     (p=0.222 n=5+5)
JoinReader/reqOrdering=true/matchratio=onetothirtytwo/lookuprows=8192/mem=100KB-16                     425ms ± 2%      417ms ± 1%   -1.93%  (p=0.032 n=5+5)
JoinReader/reqOrdering=true/matchratio=onetothirtytwo/lookuprows=8192/mem=unlimited-16                 186ms ± 1%      183ms ± 4%     ~     (p=0.310 n=5+5)
JoinReader/reqOrdering=true/matchratio=onetothirtytwo/lookuprows=16384/mem=100KB-16                    857ms ± 1%      838ms ± 1%   -2.20%  (p=0.016 n=5+5)
JoinReader/reqOrdering=true/matchratio=onetothirtytwo/lookuprows=16384/mem=unlimited-16                381ms ±11%      360ms ± 2%   -5.66%  (p=0.008 n=5+5)
JoinReader/reqOrdering=true/matchratio=onetosixtyfour/lookuprows=1/mem=100KB/parallel=true-16         78.8µs ± 3%     75.5µs ± 1%   -4.20%  (p=0.008 n=5+5)
JoinReader/reqOrdering=true/matchratio=onetosixtyfour/lookuprows=1/mem=100KB-16                       78.9µs ± 2%     75.9µs ± 1%   -3.84%  (p=0.008 n=5+5)
JoinReader/reqOrdering=true/matchratio=onetosixtyfour/lookuprows=1/mem=unlimited/parallel=true-16     78.8µs ± 3%     75.3µs ± 1%   -4.51%  (p=0.008 n=5+5)
JoinReader/reqOrdering=true/matchratio=onetosixtyfour/lookuprows=1/mem=unlimited-16                   78.4µs ± 2%     75.7µs ± 2%   -3.50%  (p=0.032 n=5+5)
JoinReader/reqOrdering=true/matchratio=onetosixtyfour/lookuprows=16/mem=100KB-16                      1.83ms ± 2%     1.81ms ± 2%     ~     (p=0.222 n=5+5)
JoinReader/reqOrdering=true/matchratio=onetosixtyfour/lookuprows=16/mem=unlimited-16                   705µs ± 3%      692µs ± 3%     ~     (p=0.310 n=5+5)
JoinReader/reqOrdering=true/matchratio=onetosixtyfour/lookuprows=256/mem=100KB-16                     25.8ms ± 3%     25.0ms ± 1%   -3.07%  (p=0.032 n=5+5)
JoinReader/reqOrdering=true/matchratio=onetosixtyfour/lookuprows=256/mem=unlimited-16                 10.5ms ± 4%     10.2ms ± 1%   -2.39%  (p=0.032 n=5+5)
JoinReader/reqOrdering=true/matchratio=onetosixtyfour/lookuprows=1024/mem=100KB-16                     102ms ± 1%       99ms ± 1%   -3.03%  (p=0.008 n=5+5)
JoinReader/reqOrdering=true/matchratio=onetosixtyfour/lookuprows=1024/mem=unlimited-16                41.6ms ± 3%     41.0ms ± 2%     ~     (p=0.310 n=5+5)
JoinReader/reqOrdering=true/matchratio=onetosixtyfour/lookuprows=4096/mem=100KB-16                     401ms ± 2%      393ms ± 1%   -1.81%  (p=0.032 n=5+5)
JoinReader/reqOrdering=true/matchratio=onetosixtyfour/lookuprows=4096/mem=unlimited-16                 168ms ± 2%      160ms ± 2%   -4.34%  (p=0.008 n=5+5)
JoinReader/reqOrdering=true/matchratio=onetosixtyfour/lookuprows=8192/mem=100KB-16                     802ms ± 1%      789ms ± 1%   -1.59%  (p=0.032 n=5+5)
JoinReader/reqOrdering=true/matchratio=onetosixtyfour/lookuprows=8192/mem=unlimited-16                 331ms ± 3%      320ms ± 3%     ~     (p=0.056 n=5+5)
JoinReader/reqOrdering=false/matchratio=onetoone/lookuprows=1/mem=unlimited/parallel=true-16          39.1µs ± 2%     35.8µs ± 2%   -8.55%  (p=0.008 n=5+5)
JoinReader/reqOrdering=false/matchratio=onetoone/lookuprows=1/mem=unlimited-16                        39.5µs ± 2%     36.1µs ± 3%   -8.57%  (p=0.008 n=5+5)
JoinReader/reqOrdering=false/matchratio=onetoone/lookuprows=16/mem=unlimited-16                        110µs ± 2%      103µs ± 2%   -6.66%  (p=0.008 n=5+5)
JoinReader/reqOrdering=false/matchratio=onetoone/lookuprows=256/mem=unlimited-16                      1.23ms ± 2%     1.12ms ± 5%   -9.09%  (p=0.008 n=5+5)
JoinReader/reqOrdering=false/matchratio=onetoone/lookuprows=1024/mem=unlimited-16                     5.02ms ± 1%     4.37ms ± 3%  -12.92%  (p=0.008 n=5+5)
JoinReader/reqOrdering=false/matchratio=onetoone/lookuprows=4096/mem=unlimited-16                     20.0ms ± 1%     18.1ms ± 5%   -9.16%  (p=0.008 n=5+5)
JoinReader/reqOrdering=false/matchratio=onetoone/lookuprows=8192/mem=unlimited-16                     40.6ms ± 2%     37.2ms ± 4%   -8.30%  (p=0.008 n=5+5)
JoinReader/reqOrdering=false/matchratio=onetoone/lookuprows=16384/mem=unlimited-16                    89.5ms ± 2%     85.1ms ± 2%   -4.87%  (p=0.008 n=5+5)
JoinReader/reqOrdering=false/matchratio=onetoone/lookuprows=32768/mem=unlimited-16                     192ms ± 3%      179ms ± 6%   -6.61%  (p=0.032 n=5+5)
JoinReader/reqOrdering=false/matchratio=onetoone/lookuprows=65536/mem=unlimited-16                     381ms ± 2%      357ms ± 4%   -6.27%  (p=0.008 n=5+5)
JoinReader/reqOrdering=false/matchratio=onetoone/lookuprows=524288/mem=unlimited-16                    3.28s ± 5%      2.92s ± 2%  -10.96%  (p=0.008 n=5+5)
JoinReader/reqOrdering=false/matchratio=onetofour/lookuprows=1/mem=unlimited/parallel=true-16         42.6µs ±10%     40.2µs ± 4%     ~     (p=0.222 n=5+5)
JoinReader/reqOrdering=false/matchratio=onetofour/lookuprows=1/mem=unlimited-16                       41.0µs ± 4%     38.6µs ± 2%   -5.88%  (p=0.008 n=5+5)
JoinReader/reqOrdering=false/matchratio=onetofour/lookuprows=16/mem=unlimited-16                       134µs ± 3%      127µs ± 2%   -4.96%  (p=0.008 n=5+5)
JoinReader/reqOrdering=false/matchratio=onetofour/lookuprows=256/mem=unlimited-16                     1.56ms ± 3%     1.51ms ± 1%   -3.28%  (p=0.016 n=5+5)
JoinReader/reqOrdering=false/matchratio=onetofour/lookuprows=1024/mem=unlimited-16                    6.23ms ± 2%     6.12ms ± 4%     ~     (p=0.310 n=5+5)
JoinReader/reqOrdering=false/matchratio=onetofour/lookuprows=4096/mem=unlimited-16                    28.0ms ± 3%     28.5ms ± 8%     ~     (p=0.421 n=5+5)
JoinReader/reqOrdering=false/matchratio=onetofour/lookuprows=8192/mem=unlimited-16                    63.7ms ± 3%     63.8ms ± 3%     ~     (p=1.000 n=5+5)
JoinReader/reqOrdering=false/matchratio=onetofour/lookuprows=16384/mem=unlimited-16                    168ms ± 2%      162ms ± 2%   -3.52%  (p=0.032 n=5+5)
JoinReader/reqOrdering=false/matchratio=onetofour/lookuprows=32768/mem=unlimited-16                    384ms ± 4%      377ms ± 5%     ~     (p=0.421 n=5+5)
JoinReader/reqOrdering=false/matchratio=onetofour/lookuprows=65536/mem=unlimited-16                    786ms ± 1%      793ms ± 3%     ~     (p=0.222 n=5+5)
JoinReader/reqOrdering=false/matchratio=onetosixteen/lookuprows=1/mem=unlimited/parallel=true-16      46.0µs ± 5%     44.2µs ± 2%     ~     (p=0.056 n=5+5)
JoinReader/reqOrdering=false/matchratio=onetosixteen/lookuprows=1/mem=unlimited-16                    44.7µs ± 3%     42.6µs ± 3%   -4.59%  (p=0.016 n=5+5)
JoinReader/reqOrdering=false/matchratio=onetosixteen/lookuprows=16/mem=unlimited-16                    200µs ± 1%      199µs ± 2%     ~     (p=0.222 n=5+5)
JoinReader/reqOrdering=false/matchratio=onetosixteen/lookuprows=256/mem=unlimited-16                  2.79ms ±14%     2.67ms ± 2%     ~     (p=0.310 n=5+5)
JoinReader/reqOrdering=false/matchratio=onetosixteen/lookuprows=1024/mem=unlimited-16                 11.6ms ± 7%     11.3ms ± 1%     ~     (p=0.310 n=5+5)
JoinReader/reqOrdering=false/matchratio=onetosixteen/lookuprows=4096/mem=unlimited-16                 59.2ms ± 4%     58.9ms ± 2%     ~     (p=0.548 n=5+5)
JoinReader/reqOrdering=false/matchratio=onetosixteen/lookuprows=8192/mem=unlimited-16                  154ms ± 4%      151ms ± 3%     ~     (p=0.310 n=5+5)
JoinReader/reqOrdering=false/matchratio=onetosixteen/lookuprows=16384/mem=unlimited-16                 467ms ± 5%      451ms ± 4%     ~     (p=0.151 n=5+5)
JoinReader/reqOrdering=false/matchratio=onetosixteen/lookuprows=32768/mem=unlimited-16                 1.03s ± 2%      1.12s ± 3%   +8.05%  (p=0.008 n=5+5)
JoinReader/reqOrdering=false/matchratio=onetothirtytwo/lookuprows=1/mem=unlimited/parallel=true-16    52.0µs ± 7%     50.9µs ± 2%     ~     (p=0.690 n=5+5)
JoinReader/reqOrdering=false/matchratio=onetothirtytwo/lookuprows=1/mem=unlimited-16                  51.0µs ± 3%     48.8µs ± 1%   -4.41%  (p=0.008 n=5+5)
JoinReader/reqOrdering=false/matchratio=onetothirtytwo/lookuprows=16/mem=unlimited-16                  306µs ± 6%      295µs ± 2%   -3.79%  (p=0.016 n=5+5)
JoinReader/reqOrdering=false/matchratio=onetothirtytwo/lookuprows=256/mem=unlimited-16                4.20ms ± 2%     4.17ms ± 3%     ~     (p=0.222 n=5+5)
JoinReader/reqOrdering=false/matchratio=onetothirtytwo/lookuprows=1024/mem=unlimited-16               18.9ms ± 3%     18.5ms ± 2%     ~     (p=0.151 n=5+5)
JoinReader/reqOrdering=false/matchratio=onetothirtytwo/lookuprows=4096/mem=unlimited-16                104ms ± 4%      100ms ± 4%     ~     (p=0.310 n=5+5)
JoinReader/reqOrdering=false/matchratio=onetothirtytwo/lookuprows=8192/mem=unlimited-16                281ms ± 4%      281ms ± 3%     ~     (p=1.000 n=5+5)
JoinReader/reqOrdering=false/matchratio=onetothirtytwo/lookuprows=16384/mem=unlimited-16               867ms ± 1%      851ms ± 1%     ~     (p=0.056 n=5+5)
JoinReader/reqOrdering=false/matchratio=onetosixtyfour/lookuprows=1/mem=unlimited/parallel=true-16    62.5µs ± 1%     61.0µs ± 2%   -2.44%  (p=0.016 n=5+5)
JoinReader/reqOrdering=false/matchratio=onetosixtyfour/lookuprows=1/mem=unlimited-16                  61.8µs ± 3%     59.7µs ± 5%     ~     (p=0.095 n=5+5)
JoinReader/reqOrdering=false/matchratio=onetosixtyfour/lookuprows=16/mem=unlimited-16                  472µs ± 4%      476µs ± 3%     ~     (p=0.310 n=5+5)
JoinReader/reqOrdering=false/matchratio=onetosixtyfour/lookuprows=256/mem=unlimited-16                7.19ms ± 2%     7.19ms ± 4%     ~     (p=0.690 n=5+5)
JoinReader/reqOrdering=false/matchratio=onetosixtyfour/lookuprows=1024/mem=unlimited-16               32.7ms ± 3%     32.0ms ± 3%     ~     (p=0.222 n=5+5)
JoinReader/reqOrdering=false/matchratio=onetosixtyfour/lookuprows=4096/mem=unlimited-16                183ms ± 2%      182ms ± 4%     ~     (p=0.841 n=5+5)
JoinReader/reqOrdering=false/matchratio=onetosixtyfour/lookuprows=8192/mem=unlimited-16                517ms ± 3%      519ms ± 5%     ~     (p=1.000 n=5+5)

name                                                                                                old speed      new speed       delta
JoinReader/reqOrdering=true/matchratio=onetoone/lookuprows=1/mem=100KB/parallel=true-16              346kB/s ± 8%    390kB/s ± 0%  +12.72%  (p=0.016 n=5+4)
JoinReader/reqOrdering=true/matchratio=onetoone/lookuprows=1/mem=100KB-16                            354kB/s ± 4%    382kB/s ± 3%   +7.91%  (p=0.008 n=5+5)
JoinReader/reqOrdering=true/matchratio=onetoone/lookuprows=1/mem=unlimited/parallel=true-16          356kB/s ± 4%    378kB/s ±10%     ~     (p=0.127 n=5+5)
JoinReader/reqOrdering=true/matchratio=onetoone/lookuprows=1/mem=unlimited-16                        364kB/s ± 2%    390kB/s ± 0%   +7.14%  (p=0.008 n=5+5)
JoinReader/reqOrdering=true/matchratio=onetoone/lookuprows=16/mem=100KB-16                          2.05MB/s ± 3%   2.25MB/s ± 1%   +9.76%  (p=0.008 n=5+5)
JoinReader/reqOrdering=true/matchratio=onetoone/lookuprows=16/mem=unlimited-16                      2.05MB/s ± 1%   2.24MB/s ± 3%   +9.37%  (p=0.008 n=5+5)
JoinReader/reqOrdering=true/matchratio=onetoone/lookuprows=256/mem=100KB-16                         2.91MB/s ± 2%   3.21MB/s ± 2%  +10.32%  (p=0.008 n=5+5)
JoinReader/reqOrdering=true/matchratio=onetoone/lookuprows=256/mem=unlimited-16                     2.93MB/s ± 1%   3.19MB/s ± 1%   +9.01%  (p=0.016 n=4+5)
JoinReader/reqOrdering=true/matchratio=onetoone/lookuprows=1024/mem=100KB-16                        2.92MB/s ± 3%   3.19MB/s ± 3%   +9.23%  (p=0.008 n=5+5)
JoinReader/reqOrdering=true/matchratio=onetoone/lookuprows=1024/mem=unlimited-16                    2.90MB/s ± 5%   3.20MB/s ± 3%  +10.34%  (p=0.008 n=5+5)
JoinReader/reqOrdering=true/matchratio=onetoone/lookuprows=4096/mem=100KB-16                        2.97MB/s ± 2%   3.29MB/s ± 2%  +10.99%  (p=0.008 n=5+5)
JoinReader/reqOrdering=true/matchratio=onetoone/lookuprows=4096/mem=unlimited-16                    2.94MB/s ± 2%   3.31MB/s ± 2%  +12.65%  (p=0.008 n=5+5)
JoinReader/reqOrdering=true/matchratio=onetoone/lookuprows=8192/mem=100KB-16                        2.93MB/s ± 3%   3.21MB/s ±10%   +9.77%  (p=0.032 n=5+5)
JoinReader/reqOrdering=true/matchratio=onetoone/lookuprows=8192/mem=unlimited-16                    2.95MB/s ± 3%   3.22MB/s ± 2%   +9.37%  (p=0.008 n=5+5)
JoinReader/reqOrdering=true/matchratio=onetoone/lookuprows=16384/mem=100KB-16                       3.24MB/s ± 3%   3.64MB/s ± 4%  +12.27%  (p=0.008 n=5+5)
JoinReader/reqOrdering=true/matchratio=onetoone/lookuprows=16384/mem=unlimited-16                   3.23MB/s ± 5%   3.68MB/s ± 1%  +13.99%  (p=0.008 n=5+5)
JoinReader/reqOrdering=true/matchratio=onetoone/lookuprows=32768/mem=100KB-16                       3.28MB/s ± 2%   3.43MB/s ± 6%     ~     (p=0.222 n=5+5)
JoinReader/reqOrdering=true/matchratio=onetoone/lookuprows=32768/mem=unlimited-16                   3.24MB/s ± 5%   3.53MB/s ±11%     ~     (p=0.079 n=5+5)
JoinReader/reqOrdering=true/matchratio=onetoone/lookuprows=65536/mem=100KB-16                       3.24MB/s ± 4%   3.62MB/s ± 4%  +11.87%  (p=0.008 n=5+5)
JoinReader/reqOrdering=true/matchratio=onetoone/lookuprows=65536/mem=unlimited-16                   3.22MB/s ± 6%   3.63MB/s ± 3%  +12.75%  (p=0.008 n=5+5)
JoinReader/reqOrdering=true/matchratio=onetoone/lookuprows=524288/mem=100KB-16                      3.25MB/s ± 4%   3.68MB/s ± 2%  +13.29%  (p=0.008 n=5+5)
JoinReader/reqOrdering=true/matchratio=onetoone/lookuprows=524288/mem=unlimited-16                  3.26MB/s ± 1%   3.66MB/s ± 1%  +12.25%  (p=0.008 n=5+5)
JoinReader/reqOrdering=true/matchratio=onetofour/lookuprows=1/mem=100KB/parallel=true-16             890kB/s ± 2%    940kB/s ± 2%   +5.62%  (p=0.008 n=5+5)
JoinReader/reqOrdering=true/matchratio=onetofour/lookuprows=1/mem=100KB-16                           890kB/s ± 1%    942kB/s ± 1%   +5.84%  (p=0.008 n=5+5)
JoinReader/reqOrdering=true/matchratio=onetofour/lookuprows=1/mem=unlimited/parallel=true-16         878kB/s ± 2%    934kB/s ± 3%   +6.38%  (p=0.008 n=5+5)
JoinReader/reqOrdering=true/matchratio=onetofour/lookuprows=1/mem=unlimited-16                       884kB/s ± 2%    908kB/s ± 4%     ~     (p=0.206 n=5+5)
JoinReader/reqOrdering=true/matchratio=onetofour/lookuprows=16/mem=100KB-16                         4.32MB/s ± 1%   4.20MB/s ± 4%     ~     (p=0.159 n=4+5)
JoinReader/reqOrdering=true/matchratio=onetofour/lookuprows=16/mem=unlimited-16                     4.09MB/s ± 5%   4.38MB/s ± 7%   +7.10%  (p=0.048 n=5+5)
JoinReader/reqOrdering=true/matchratio=onetofour/lookuprows=256/mem=100KB-16                        5.66MB/s ± 4%   5.82MB/s ± 4%     ~     (p=0.087 n=5+5)
JoinReader/reqOrdering=true/matchratio=onetofour/lookuprows=256/mem=unlimited-16                    5.65MB/s ± 3%   5.90MB/s ± 4%   +4.46%  (p=0.032 n=5+5)
JoinReader/reqOrdering=true/matchratio=onetofour/lookuprows=1024/mem=100KB-16                       5.82MB/s ± 2%   5.96MB/s ± 3%     ~     (p=0.135 n=5+5)
JoinReader/reqOrdering=true/matchratio=onetofour/lookuprows=1024/mem=unlimited-16                   5.79MB/s ± 4%   6.05MB/s ± 1%   +4.53%  (p=0.016 n=5+5)
JoinReader/reqOrdering=true/matchratio=onetofour/lookuprows=4096/mem=100KB-16                       5.89MB/s ± 2%   5.94MB/s ± 4%     ~     (p=0.548 n=5+5)
JoinReader/reqOrdering=true/matchratio=onetofour/lookuprows=4096/mem=unlimited-16                   5.89MB/s ± 4%   6.11MB/s ± 3%     ~     (p=0.056 n=5+5)
JoinReader/reqOrdering=true/matchratio=onetofour/lookuprows=8192/mem=100KB-16                       5.65MB/s ±14%   6.02MB/s ± 2%     ~     (p=0.095 n=5+5)
JoinReader/reqOrdering=true/matchratio=onetofour/lookuprows=8192/mem=unlimited-16                   5.83MB/s ± 2%   5.99MB/s ± 5%     ~     (p=0.151 n=5+5)
JoinReader/reqOrdering=true/matchratio=onetofour/lookuprows=16384/mem=100KB-16                      5.79MB/s ± 2%   6.24MB/s ± 2%   +7.84%  (p=0.008 n=5+5)
JoinReader/reqOrdering=true/matchratio=onetofour/lookuprows=16384/mem=unlimited-16                  5.96MB/s ± 3%   5.89MB/s ± 5%     ~     (p=0.421 n=5+5)
JoinReader/reqOrdering=true/matchratio=onetofour/lookuprows=32768/mem=100KB-16                      6.00MB/s ± 3%   5.95MB/s ± 3%     ~     (p=0.421 n=5+5)
JoinReader/reqOrdering=true/matchratio=onetofour/lookuprows=32768/mem=unlimited-16                  5.90MB/s ± 3%   6.07MB/s ± 6%     ~     (p=0.151 n=5+5)
JoinReader/reqOrdering=true/matchratio=onetofour/lookuprows=65536/mem=100KB-16                      5.90MB/s ± 2%   6.10MB/s ± 4%     ~     (p=0.056 n=5+5)
JoinReader/reqOrdering=true/matchratio=onetofour/lookuprows=65536/mem=unlimited-16                  5.93MB/s ± 3%   6.09MB/s ± 3%     ~     (p=0.135 n=5+5)
JoinReader/reqOrdering=true/matchratio=onetosixteen/lookuprows=1/mem=100KB/parallel=true-16         2.43MB/s ± 7%   2.67MB/s ± 5%   +9.70%  (p=0.032 n=5+5)
JoinReader/reqOrdering=true/matchratio=onetosixteen/lookuprows=1/mem=100KB-16                       2.51MB/s ± 6%   2.71MB/s ± 2%   +7.96%  (p=0.008 n=5+5)
JoinReader/reqOrdering=true/matchratio=onetosixteen/lookuprows=1/mem=unlimited/parallel=true-16     2.52MB/s ± 3%   2.69MB/s ± 4%   +6.50%  (p=0.008 n=5+5)
JoinReader/reqOrdering=true/matchratio=onetosixteen/lookuprows=1/mem=unlimited-16                   2.46MB/s ± 6%   2.71MB/s ± 3%   +9.98%  (p=0.016 n=5+5)
JoinReader/reqOrdering=true/matchratio=onetosixteen/lookuprows=16/mem=100KB-16                      7.69MB/s ± 9%   8.52MB/s ± 2%  +10.71%  (p=0.008 n=5+5)
JoinReader/reqOrdering=true/matchratio=onetosixteen/lookuprows=16/mem=unlimited-16                  8.14MB/s ± 3%   8.44MB/s ± 3%   +3.79%  (p=0.032 n=5+5)
JoinReader/reqOrdering=true/matchratio=onetosixteen/lookuprows=256/mem=100KB-16                     4.47MB/s ± 6%   4.71MB/s ± 2%   +5.23%  (p=0.008 n=5+5)
JoinReader/reqOrdering=true/matchratio=onetosixteen/lookuprows=256/mem=unlimited-16                 9.81MB/s ± 2%  10.08MB/s ± 2%   +2.77%  (p=0.024 n=5+5)
JoinReader/reqOrdering=true/matchratio=onetosixteen/lookuprows=1024/mem=100KB-16                    4.48MB/s ±11%   4.78MB/s ± 1%   +6.70%  (p=0.040 n=5+5)
JoinReader/reqOrdering=true/matchratio=onetosixteen/lookuprows=1024/mem=unlimited-16                9.93MB/s ± 4%  10.01MB/s ± 2%     ~     (p=0.421 n=5+5)
JoinReader/reqOrdering=true/matchratio=onetosixteen/lookuprows=4096/mem=100KB-16                    4.63MB/s ± 4%   4.78MB/s ± 2%   +3.37%  (p=0.040 n=5+5)
JoinReader/reqOrdering=true/matchratio=onetosixteen/lookuprows=4096/mem=unlimited-16                9.35MB/s ± 5%  10.26MB/s ± 1%   +9.69%  (p=0.008 n=5+5)
JoinReader/reqOrdering=true/matchratio=onetosixteen/lookuprows=8192/mem=100KB-16                    4.61MB/s ± 5%   4.77MB/s ± 2%     ~     (p=0.151 n=5+5)
JoinReader/reqOrdering=true/matchratio=onetosixteen/lookuprows=8192/mem=unlimited-16                10.0MB/s ± 1%   10.1MB/s ± 3%     ~     (p=0.690 n=5+5)
JoinReader/reqOrdering=true/matchratio=onetosixteen/lookuprows=16384/mem=100KB-16                   4.66MB/s ± 2%   4.81MB/s ± 1%   +3.22%  (p=0.016 n=5+5)
JoinReader/reqOrdering=true/matchratio=onetosixteen/lookuprows=16384/mem=unlimited-16               9.91MB/s ± 2%  10.40MB/s ± 2%   +4.88%  (p=0.008 n=5+5)
JoinReader/reqOrdering=true/matchratio=onetosixteen/lookuprows=32768/mem=100KB-16                   4.31MB/s ±12%   4.76MB/s ± 2%  +10.43%  (p=0.008 n=5+5)
JoinReader/reqOrdering=true/matchratio=onetosixteen/lookuprows=32768/mem=unlimited-16               9.88MB/s ± 3%  10.26MB/s ± 2%   +3.87%  (p=0.008 n=5+5)
JoinReader/reqOrdering=true/matchratio=onetothirtytwo/lookuprows=1/mem=100KB/parallel=true-16       4.22MB/s ± 5%   4.51MB/s ± 1%   +7.02%  (p=0.008 n=5+5)
JoinReader/reqOrdering=true/matchratio=onetothirtytwo/lookuprows=1/mem=100KB-16                     4.33MB/s ± 3%   4.36MB/s ±11%     ~     (p=0.222 n=5+5)
JoinReader/reqOrdering=true/matchratio=onetothirtytwo/lookuprows=1/mem=unlimited/parallel=true-16   4.04MB/s ± 5%   4.51MB/s ± 2%  +11.74%  (p=0.008 n=5+5)
JoinReader/reqOrdering=true/matchratio=onetothirtytwo/lookuprows=1/mem=unlimited-16                 4.01MB/s ±12%   4.44MB/s ± 2%  +10.66%  (p=0.008 n=5+5)
JoinReader/reqOrdering=true/matchratio=onetothirtytwo/lookuprows=16/mem=100KB-16                    9.90MB/s ± 1%  10.32MB/s ± 2%   +4.18%  (p=0.008 n=5+5)
JoinReader/reqOrdering=true/matchratio=onetothirtytwo/lookuprows=16/mem=unlimited-16                9.80MB/s ± 4%  10.52MB/s ± 2%   +7.43%  (p=0.008 n=5+5)
JoinReader/reqOrdering=true/matchratio=onetothirtytwo/lookuprows=256/mem=100KB-16                   5.00MB/s ± 2%   5.07MB/s ± 2%     ~     (p=0.198 n=5+5)
JoinReader/reqOrdering=true/matchratio=onetothirtytwo/lookuprows=256/mem=unlimited-16               11.5MB/s ± 3%   11.8MB/s ± 3%     ~     (p=0.310 n=5+5)
JoinReader/reqOrdering=true/matchratio=onetothirtytwo/lookuprows=1024/mem=100KB-16                  4.97MB/s ± 4%   5.17MB/s ± 3%   +4.11%  (p=0.032 n=5+5)
JoinReader/reqOrdering=true/matchratio=onetothirtytwo/lookuprows=1024/mem=unlimited-16              11.4MB/s ± 6%   11.8MB/s ± 2%     ~     (p=0.056 n=5+5)
JoinReader/reqOrdering=true/matchratio=onetothirtytwo/lookuprows=4096/mem=100KB-16                  5.09MB/s ± 2%   5.14MB/s ± 1%     ~     (p=0.460 n=5+5)
JoinReader/reqOrdering=true/matchratio=onetothirtytwo/lookuprows=4096/mem=unlimited-16              11.7MB/s ± 6%   12.0MB/s ± 2%     ~     (p=0.222 n=5+5)
JoinReader/reqOrdering=true/matchratio=onetothirtytwo/lookuprows=8192/mem=100KB-16                  5.09MB/s ± 2%   5.19MB/s ± 1%   +1.96%  (p=0.032 n=5+5)
JoinReader/reqOrdering=true/matchratio=onetothirtytwo/lookuprows=8192/mem=unlimited-16              11.6MB/s ± 1%   11.8MB/s ± 4%     ~     (p=0.310 n=5+5)
JoinReader/reqOrdering=true/matchratio=onetothirtytwo/lookuprows=16384/mem=100KB-16                 5.05MB/s ± 1%   5.16MB/s ± 1%   +2.26%  (p=0.016 n=5+5)
JoinReader/reqOrdering=true/matchratio=onetothirtytwo/lookuprows=16384/mem=unlimited-16             11.4MB/s ±10%   12.0MB/s ± 2%   +5.73%  (p=0.008 n=5+5)
JoinReader/reqOrdering=true/matchratio=onetosixtyfour/lookuprows=1/mem=100KB/parallel=true-16       6.60MB/s ± 3%   6.89MB/s ± 1%   +4.33%  (p=0.016 n=5+5)
JoinReader/reqOrdering=true/matchratio=onetosixtyfour/lookuprows=1/mem=100KB-16                     6.59MB/s ± 2%   6.85MB/s ± 1%   +3.97%  (p=0.008 n=5+5)
JoinReader/reqOrdering=true/matchratio=onetosixtyfour/lookuprows=1/mem=unlimited/parallel=true-16   6.60MB/s ± 3%   6.91MB/s ± 1%   +4.70%  (p=0.008 n=5+5)
JoinReader/reqOrdering=true/matchratio=onetosixtyfour/lookuprows=1/mem=unlimited-16                 6.63MB/s ± 2%   6.87MB/s ± 2%   +3.62%  (p=0.032 n=5+5)
JoinReader/reqOrdering=true/matchratio=onetosixtyfour/lookuprows=16/mem=100KB-16                    4.54MB/s ± 2%   4.61MB/s ± 2%     ~     (p=0.230 n=5+5)
JoinReader/reqOrdering=true/matchratio=onetosixtyfour/lookuprows=16/mem=unlimited-16                11.8MB/s ± 3%   12.0MB/s ± 2%     ~     (p=0.310 n=5+5)
JoinReader/reqOrdering=true/matchratio=onetosixtyfour/lookuprows=256/mem=100KB-16                   5.15MB/s ± 3%   5.31MB/s ± 0%   +3.10%  (p=0.040 n=5+5)
JoinReader/reqOrdering=true/matchratio=onetosixtyfour/lookuprows=256/mem=unlimited-16               12.7MB/s ± 3%   13.0MB/s ± 1%   +2.41%  (p=0.040 n=5+5)
JoinReader/reqOrdering=true/matchratio=onetosixtyfour/lookuprows=1024/mem=100KB-16                  5.23MB/s ± 2%   5.39MB/s ± 1%   +3.10%  (p=0.008 n=5+5)
JoinReader/reqOrdering=true/matchratio=onetosixtyfour/lookuprows=1024/mem=unlimited-16              12.8MB/s ± 3%   13.0MB/s ± 2%     ~     (p=0.310 n=5+5)
JoinReader/reqOrdering=true/matchratio=onetosixtyfour/lookuprows=4096/mem=100KB-16                  5.32MB/s ± 2%   5.41MB/s ± 1%   +1.81%  (p=0.032 n=5+5)
JoinReader/reqOrdering=true/matchratio=onetosixtyfour/lookuprows=4096/mem=unlimited-16              12.7MB/s ± 2%   13.3MB/s ± 2%   +4.52%  (p=0.008 n=5+5)
JoinReader/reqOrdering=true/matchratio=onetosixtyfour/lookuprows=8192/mem=100KB-16                  5.31MB/s ± 2%   5.40MB/s ± 1%   +1.66%  (p=0.032 n=5+5)
JoinReader/reqOrdering=true/matchratio=onetosixtyfour/lookuprows=8192/mem=unlimited-16              12.9MB/s ± 3%   13.3MB/s ± 3%     ~     (p=0.056 n=5+5)
JoinReader/reqOrdering=false/matchratio=onetoone/lookuprows=1/mem=unlimited/parallel=true-16         408kB/s ± 3%    446kB/s ± 1%   +9.31%  (p=0.008 n=5+5)
JoinReader/reqOrdering=false/matchratio=onetoone/lookuprows=1/mem=unlimited-16                       406kB/s ± 1%    442kB/s ± 3%   +8.87%  (p=0.008 n=5+5)
JoinReader/reqOrdering=false/matchratio=onetoone/lookuprows=16/mem=unlimited-16                     2.33MB/s ± 2%   2.50MB/s ± 2%   +7.12%  (p=0.008 n=5+5)
JoinReader/reqOrdering=false/matchratio=onetoone/lookuprows=256/mem=unlimited-16                    3.32MB/s ± 2%   3.66MB/s ± 5%  +10.05%  (p=0.008 n=5+5)
JoinReader/reqOrdering=false/matchratio=onetoone/lookuprows=1024/mem=unlimited-16                   3.27MB/s ± 1%   3.75MB/s ± 3%  +14.88%  (p=0.008 n=5+5)
JoinReader/reqOrdering=false/matchratio=onetoone/lookuprows=4096/mem=unlimited-16                   3.28MB/s ± 1%   3.62MB/s ± 5%  +10.11%  (p=0.008 n=5+5)
JoinReader/reqOrdering=false/matchratio=onetoone/lookuprows=8192/mem=unlimited-16                   3.23MB/s ± 2%   3.52MB/s ± 4%   +9.03%  (p=0.008 n=5+5)
JoinReader/reqOrdering=false/matchratio=onetoone/lookuprows=16384/mem=unlimited-16                  2.92MB/s ± 0%   3.08MB/s ± 2%   +5.64%  (p=0.016 n=4+5)
JoinReader/reqOrdering=false/matchratio=onetoone/lookuprows=32768/mem=unlimited-16                  2.73MB/s ± 3%   2.93MB/s ± 6%   +7.10%  (p=0.032 n=5+5)
JoinReader/reqOrdering=false/matchratio=onetoone/lookuprows=65536/mem=unlimited-16                  2.75MB/s ± 2%   2.94MB/s ± 4%   +6.76%  (p=0.008 n=5+5)
JoinReader/reqOrdering=false/matchratio=onetoone/lookuprows=524288/mem=unlimited-16                 2.56MB/s ± 5%   2.87MB/s ± 2%  +12.35%  (p=0.008 n=5+5)
JoinReader/reqOrdering=false/matchratio=onetofour/lookuprows=1/mem=unlimited/parallel=true-16        942kB/s ±10%    996kB/s ± 5%     ~     (p=0.190 n=5+5)
JoinReader/reqOrdering=false/matchratio=onetofour/lookuprows=1/mem=unlimited-16                      976kB/s ± 3%   1036kB/s ± 3%   +6.15%  (p=0.016 n=5+5)
JoinReader/reqOrdering=false/matchratio=onetofour/lookuprows=16/mem=unlimited-16                    4.79MB/s ± 3%   5.04MB/s ± 2%   +5.22%  (p=0.008 n=5+5)
JoinReader/reqOrdering=false/matchratio=onetofour/lookuprows=256/mem=unlimited-16                   6.58MB/s ± 3%   6.80MB/s ± 1%   +3.34%  (p=0.016 n=5+5)
JoinReader/reqOrdering=false/matchratio=onetofour/lookuprows=1024/mem=unlimited-16                  6.58MB/s ± 2%   6.69MB/s ± 4%     ~     (p=0.310 n=5+5)
JoinReader/reqOrdering=false/matchratio=onetofour/lookuprows=4096/mem=unlimited-16                  5.85MB/s ± 3%   5.77MB/s ± 9%     ~     (p=0.421 n=5+5)
JoinReader/reqOrdering=false/matchratio=onetofour/lookuprows=8192/mem=unlimited-16                  5.15MB/s ± 3%   5.13MB/s ± 3%     ~     (p=0.810 n=5+5)
JoinReader/reqOrdering=false/matchratio=onetofour/lookuprows=16384/mem=unlimited-16                 3.90MB/s ± 2%   4.04MB/s ± 2%   +3.64%  (p=0.032 n=5+5)
JoinReader/reqOrdering=false/matchratio=onetofour/lookuprows=32768/mem=unlimited-16                 3.42MB/s ± 4%   3.48MB/s ± 5%     ~     (p=0.413 n=5+5)
JoinReader/reqOrdering=false/matchratio=onetofour/lookuprows=65536/mem=unlimited-16                 3.33MB/s ± 1%   3.30MB/s ± 3%     ~     (p=0.175 n=5+5)
JoinReader/reqOrdering=false/matchratio=onetosixteen/lookuprows=1/mem=unlimited/parallel=true-16    2.96MB/s ± 5%   3.08MB/s ± 2%     ~     (p=0.095 n=5+5)
JoinReader/reqOrdering=false/matchratio=onetosixteen/lookuprows=1/mem=unlimited-16                  3.04MB/s ± 3%   3.19MB/s ± 3%   +4.86%  (p=0.016 n=5+5)
JoinReader/reqOrdering=false/matchratio=onetosixteen/lookuprows=16/mem=unlimited-16                 10.9MB/s ± 1%   11.0MB/s ± 2%     ~     (p=0.254 n=5+5)
JoinReader/reqOrdering=false/matchratio=onetosixteen/lookuprows=256/mem=unlimited-16                12.5MB/s ±12%   13.0MB/s ± 2%     ~     (p=0.310 n=5+5)
JoinReader/reqOrdering=false/matchratio=onetosixteen/lookuprows=1024/mem=unlimited-16               12.0MB/s ± 6%   12.3MB/s ± 1%     ~     (p=0.310 n=5+5)
JoinReader/reqOrdering=false/matchratio=onetosixteen/lookuprows=4096/mem=unlimited-16               9.41MB/s ± 5%   9.47MB/s ± 2%     ~     (p=0.548 n=5+5)
JoinReader/reqOrdering=false/matchratio=onetosixteen/lookuprows=8192/mem=unlimited-16               7.26MB/s ± 3%   7.36MB/s ± 3%     ~     (p=0.310 n=5+5)
JoinReader/reqOrdering=false/matchratio=onetosixteen/lookuprows=16384/mem=unlimited-16              4.77MB/s ± 5%   4.94MB/s ± 4%     ~     (p=0.135 n=5+5)
JoinReader/reqOrdering=false/matchratio=onetosixteen/lookuprows=32768/mem=unlimited-16              4.32MB/s ± 2%   3.99MB/s ± 3%   -7.50%  (p=0.008 n=5+5)
JoinReader/reqOrdering=false/matchratio=onetothirtytwo/lookuprows=1/mem=unlimited/parallel=true-16  5.08MB/s ± 7%   5.18MB/s ± 2%     ~     (p=0.643 n=5+5)
JoinReader/reqOrdering=false/matchratio=onetothirtytwo/lookuprows=1/mem=unlimited-16                5.18MB/s ± 3%   5.41MB/s ± 1%   +4.56%  (p=0.008 n=5+5)
JoinReader/reqOrdering=false/matchratio=onetothirtytwo/lookuprows=16/mem=unlimited-16               13.8MB/s ± 6%   14.3MB/s ± 2%   +3.87%  (p=0.016 n=5+5)
JoinReader/reqOrdering=false/matchratio=onetothirtytwo/lookuprows=256/mem=unlimited-16              16.1MB/s ± 2%   16.2MB/s ± 3%     ~     (p=0.222 n=5+5)
JoinReader/reqOrdering=false/matchratio=onetothirtytwo/lookuprows=1024/mem=unlimited-16             14.3MB/s ± 3%   14.6MB/s ± 2%     ~     (p=0.151 n=5+5)
JoinReader/reqOrdering=false/matchratio=onetothirtytwo/lookuprows=4096/mem=unlimited-16             10.4MB/s ± 4%   10.7MB/s ± 1%     ~     (p=0.524 n=5+4)
JoinReader/reqOrdering=false/matchratio=onetothirtytwo/lookuprows=8192/mem=unlimited-16             7.71MB/s ± 4%   7.71MB/s ± 3%     ~     (p=0.968 n=5+5)
JoinReader/reqOrdering=false/matchratio=onetothirtytwo/lookuprows=16384/mem=unlimited-16            4.99MB/s ± 1%   5.09MB/s ± 1%     ~     (p=0.063 n=5+5)
JoinReader/reqOrdering=false/matchratio=onetosixtyfour/lookuprows=1/mem=unlimited/parallel=true-16  8.32MB/s ± 1%   8.53MB/s ± 2%   +2.50%  (p=0.016 n=5+5)
JoinReader/reqOrdering=false/matchratio=onetosixtyfour/lookuprows=1/mem=unlimited-16                8.41MB/s ± 3%   8.72MB/s ± 5%     ~     (p=0.079 n=5+5)
JoinReader/reqOrdering=false/matchratio=onetosixtyfour/lookuprows=16/mem=unlimited-16               17.6MB/s ± 4%   17.5MB/s ± 3%     ~     (p=0.341 n=5+5)
JoinReader/reqOrdering=false/matchratio=onetosixtyfour/lookuprows=256/mem=unlimited-16              18.5MB/s ± 2%   18.5MB/s ± 4%     ~     (p=0.587 n=5+5)
JoinReader/reqOrdering=false/matchratio=onetosixtyfour/lookuprows=1024/mem=unlimited-16             16.3MB/s ± 3%   16.6MB/s ± 3%     ~     (p=0.222 n=5+5)
JoinReader/reqOrdering=false/matchratio=onetosixtyfour/lookuprows=4096/mem=unlimited-16             11.6MB/s ± 2%   11.7MB/s ± 4%     ~     (p=0.786 n=5+5)
JoinReader/reqOrdering=false/matchratio=onetosixtyfour/lookuprows=8192/mem=unlimited-16             8.25MB/s ± 3%   8.22MB/s ± 5%     ~     (p=0.881 n=5+5)

name                                                                                                old alloc/op   new alloc/op    delta
JoinReader/reqOrdering=true/matchratio=onetoone/lookuprows=1/mem=100KB/parallel=true-16               25.5kB ± 1%     25.6kB ± 1%     ~     (p=0.222 n=5+5)
JoinReader/reqOrdering=true/matchratio=onetoone/lookuprows=1/mem=100KB-16                             25.4kB ± 0%     26.0kB ± 7%   +2.38%  (p=0.016 n=4+5)
JoinReader/reqOrdering=true/matchratio=onetoone/lookuprows=1/mem=unlimited/parallel=true-16           25.4kB ± 0%     25.5kB ± 0%   +0.30%  (p=0.029 n=4+4)
JoinReader/reqOrdering=true/matchratio=onetoone/lookuprows=1/mem=unlimited-16                         25.4kB ± 0%     25.5kB ± 0%   +0.31%  (p=0.016 n=4+5)
JoinReader/reqOrdering=true/matchratio=onetoone/lookuprows=16/mem=100KB-16                            39.7kB ± 0%     40.2kB ± 0%   +1.39%  (p=0.029 n=4+4)
JoinReader/reqOrdering=true/matchratio=onetoone/lookuprows=16/mem=unlimited-16                        39.7kB ± 0%     40.2kB ± 0%   +1.35%  (p=0.016 n=5+4)
JoinReader/reqOrdering=true/matchratio=onetoone/lookuprows=256/mem=100KB-16                            259kB ± 0%      264kB ± 0%   +1.76%  (p=0.016 n=4+5)
JoinReader/reqOrdering=true/matchratio=onetoone/lookuprows=256/mem=unlimited-16                        260kB ± 0%      264kB ± 0%   +1.38%  (p=0.016 n=5+4)
JoinReader/reqOrdering=true/matchratio=onetoone/lookuprows=1024/mem=100KB-16                           830kB ± 0%      841kB ± 3%   +1.28%  (p=0.016 n=4+5)
JoinReader/reqOrdering=true/matchratio=onetoone/lookuprows=1024/mem=unlimited-16                       844kB ± 3%      834kB ± 0%     ~     (p=0.730 n=5+4)
JoinReader/reqOrdering=true/matchratio=onetoone/lookuprows=4096/mem=100KB-16                          3.11MB ± 0%     3.49MB ±30%     ~     (p=0.151 n=5+5)
JoinReader/reqOrdering=true/matchratio=onetoone/lookuprows=4096/mem=unlimited-16                      3.11MB ± 0%     3.11MB ± 0%     ~     (p=0.686 n=4+4)
JoinReader/reqOrdering=true/matchratio=onetoone/lookuprows=8192/mem=100KB-16                          6.16MB ± 0%     6.16MB ± 0%     ~     (p=0.730 n=4+5)
JoinReader/reqOrdering=true/matchratio=onetoone/lookuprows=8192/mem=unlimited-16                      6.17MB ± 0%     6.16MB ± 0%     ~     (p=0.556 n=5+4)
JoinReader/reqOrdering=true/matchratio=onetoone/lookuprows=16384/mem=100KB-16                         12.3MB ± 3%     12.2MB ± 0%     ~     (p=0.905 n=5+4)
JoinReader/reqOrdering=true/matchratio=onetoone/lookuprows=16384/mem=unlimited-16                     12.3MB ± 3%     12.2MB ± 0%     ~     (p=0.222 n=5+5)
JoinReader/reqOrdering=true/matchratio=onetoone/lookuprows=32768/mem=100KB-16                         24.6MB ± 2%     25.9MB ± 6%     ~     (p=0.095 n=5+5)
JoinReader/reqOrdering=true/matchratio=onetoone/lookuprows=32768/mem=unlimited-16                     24.5MB ± 1%     25.0MB ± 6%     ~     (p=0.421 n=5+5)
JoinReader/reqOrdering=true/matchratio=onetoone/lookuprows=65536/mem=100KB-16                         49.1MB ± 3%     48.8MB ± 0%     ~     (p=0.556 n=5+4)
JoinReader/reqOrdering=true/matchratio=onetoone/lookuprows=65536/mem=unlimited-16                     51.3MB ± 8%     48.9MB ± 1%     ~     (p=0.310 n=5+5)
JoinReader/reqOrdering=true/matchratio=onetoone/lookuprows=524288/mem=100KB-16                         392MB ± 1%      391MB ± 2%     ~     (p=0.421 n=5+5)
JoinReader/reqOrdering=true/matchratio=onetoone/lookuprows=524288/mem=unlimited-16                     391MB ± 1%      389MB ± 0%     ~     (p=0.286 n=5+4)
JoinReader/reqOrdering=true/matchratio=onetofour/lookuprows=1/mem=100KB/parallel=true-16              25.6kB ± 0%     25.7kB ± 0%     ~     (p=0.095 n=5+4)
JoinReader/reqOrdering=true/matchratio=onetofour/lookuprows=1/mem=100KB-16                            25.6kB ± 0%     25.7kB ± 0%   +0.31%  (p=0.016 n=5+4)
JoinReader/reqOrdering=true/matchratio=onetofour/lookuprows=1/mem=unlimited/parallel=true-16          25.6kB ± 0%     25.8kB ± 2%   +0.78%  (p=0.008 n=5+5)
JoinReader/reqOrdering=true/matchratio=onetofour/lookuprows=1/mem=unlimited-16                        25.6kB ± 0%     25.7kB ± 0%   +0.27%  (p=0.016 n=5+4)
JoinReader/reqOrdering=true/matchratio=onetofour/lookuprows=16/mem=100KB-16                           44.0kB ± 0%     45.7kB ± 3%   +3.93%  (p=0.016 n=4+5)
JoinReader/reqOrdering=true/matchratio=onetofour/lookuprows=16/mem=unlimited-16                       45.5kB ± 4%     44.6kB ± 0%     ~     (p=0.730 n=5+4)
JoinReader/reqOrdering=true/matchratio=onetofour/lookuprows=256/mem=100KB-16                           361kB ± 0%      367kB ± 2%   +1.69%  (p=0.008 n=5+5)
JoinReader/reqOrdering=true/matchratio=onetofour/lookuprows=256/mem=unlimited-16                       361kB ± 0%      364kB ± 0%   +1.02%  (p=0.008 n=5+5)
JoinReader/reqOrdering=true/matchratio=onetofour/lookuprows=1024/mem=100KB-16                         1.11MB ± 2%     1.11MB ± 0%     ~     (p=0.841 n=5+5)
JoinReader/reqOrdering=true/matchratio=onetofour/lookuprows=1024/mem=unlimited-16                     1.10MB ± 0%     1.11MB ± 0%   +0.51%  (p=0.032 n=5+4)
JoinReader/reqOrdering=true/matchratio=onetofour/lookuprows=4096/mem=100KB-16                         4.11MB ± 3%     4.12MB ± 4%     ~     (p=0.548 n=5+5)
JoinReader/reqOrdering=true/matchratio=onetofour/lookuprows=4096/mem=unlimited-16                     4.08MB ± 0%     4.07MB ± 0%     ~     (p=0.686 n=4+4)
JoinReader/reqOrdering=true/matchratio=onetofour/lookuprows=8192/mem=100KB-16                         8.04MB ± 0%     8.04MB ± 0%     ~     (p=1.000 n=5+5)
JoinReader/reqOrdering=true/matchratio=onetofour/lookuprows=8192/mem=unlimited-16                     8.09MB ± 3%     8.04MB ± 0%     ~     (p=0.413 n=5+4)
JoinReader/reqOrdering=true/matchratio=onetofour/lookuprows=16384/mem=100KB-16                        16.0MB ± 1%     16.0MB ± 0%     ~     (p=0.730 n=5+4)
JoinReader/reqOrdering=true/matchratio=onetofour/lookuprows=16384/mem=unlimited-16                    16.0MB ± 0%     16.1MB ± 4%     ~     (p=1.000 n=5+5)
JoinReader/reqOrdering=true/matchratio=onetofour/lookuprows=32768/mem=100KB-16                        32.0MB ± 1%     31.9MB ± 1%     ~     (p=0.841 n=5+5)
JoinReader/reqOrdering=true/matchratio=onetofour/lookuprows=32768/mem=unlimited-16                    32.0MB ± 3%     31.8MB ± 0%     ~     (p=0.905 n=5+4)
JoinReader/reqOrdering=true/matchratio=onetofour/lookuprows=65536/mem=100KB-16                        63.6MB ± 1%     63.5MB ± 0%     ~     (p=0.905 n=5+4)
JoinReader/reqOrdering=true/matchratio=onetofour/lookuprows=65536/mem=unlimited-16                    64.1MB ± 2%     64.2MB ± 3%     ~     (p=0.841 n=5+5)
JoinReader/reqOrdering=true/matchratio=onetosixteen/lookuprows=1/mem=100KB/parallel=true-16           26.8kB ± 0%     27.2kB ± 2%   +1.55%  (p=0.008 n=5+5)
JoinReader/reqOrdering=true/matchratio=onetosixteen/lookuprows=1/mem=100KB-16                         26.8kB ± 0%     26.9kB ± 0%     ~     (p=0.175 n=5+4)
JoinReader/reqOrdering=true/matchratio=onetosixteen/lookuprows=1/mem=unlimited/parallel=true-16       26.9kB ± 1%     26.9kB ± 0%     ~     (p=0.190 n=5+4)
JoinReader/reqOrdering=true/matchratio=onetosixteen/lookuprows=1/mem=unlimited-16                     26.8kB ± 0%     26.9kB ± 0%   +0.26%  (p=0.029 n=4+4)
JoinReader/reqOrdering=true/matchratio=onetosixteen/lookuprows=16/mem=100KB-16                        82.8kB ± 0%     83.2kB ± 0%   +0.45%  (p=0.032 n=5+5)
JoinReader/reqOrdering=true/matchratio=onetosixteen/lookuprows=16/mem=unlimited-16                    83.0kB ± 1%     83.2kB ± 0%     ~     (p=0.190 n=5+4)
JoinReader/reqOrdering=true/matchratio=onetosixteen/lookuprows=256/mem=100KB-16                       1.62MB ± 6%     1.58MB ± 0%     ~     (p=0.841 n=5+5)
JoinReader/reqOrdering=true/matchratio=onetosixteen/lookuprows=256/mem=unlimited-16                    817kB ± 1%      817kB ± 0%     ~     (p=0.286 n=5+4)
JoinReader/reqOrdering=true/matchratio=onetosixteen/lookuprows=1024/mem=100KB-16                      5.50MB ± 1%     5.50MB ± 0%     ~     (p=1.000 n=5+5)
JoinReader/reqOrdering=true/matchratio=onetosixteen/lookuprows=1024/mem=unlimited-16                  2.37MB ± 0%     2.39MB ± 3%     ~     (p=0.190 n=4+5)
JoinReader/reqOrdering=true/matchratio=onetosixteen/lookuprows=4096/mem=100KB-16                      21.4MB ± 2%     21.4MB ± 3%     ~     (p=1.000 n=5+5)
JoinReader/reqOrdering=true/matchratio=onetosixteen/lookuprows=4096/mem=unlimited-16                  8.60MB ± 0%     8.60MB ± 0%     ~     (p=1.000 n=5+5)
JoinReader/reqOrdering=true/matchratio=onetosixteen/lookuprows=8192/mem=100KB-16                      42.3MB ± 1%     42.2MB ± 0%     ~     (p=0.905 n=5+4)
JoinReader/reqOrdering=true/matchratio=onetosixteen/lookuprows=8192/mem=unlimited-16                  16.9MB ± 0%     17.1MB ± 3%     ~     (p=0.190 n=4+5)
JoinReader/reqOrdering=true/matchratio=onetosixteen/lookuprows=16384/mem=100KB-16                     85.3MB ± 2%     85.2MB ± 1%     ~     (p=1.000 n=5+5)
JoinReader/reqOrdering=true/matchratio=onetosixteen/lookuprows=16384/mem=unlimited-16                 33.6MB ± 1%     33.9MB ± 4%     ~     (p=0.548 n=5+5)
JoinReader/reqOrdering=true/matchratio=onetosixteen/lookuprows=32768/mem=100KB-16                      171MB ± 1%      170MB ± 0%     ~     (p=0.056 n=5+5)
JoinReader/reqOrdering=true/matchratio=onetosixteen/lookuprows=32768/mem=unlimited-16                 66.7MB ± 0%     66.8MB ± 0%     ~     (p=0.486 n=4+4)
JoinReader/reqOrdering=true/matchratio=onetothirtytwo/lookuprows=1/mem=100KB/parallel=true-16         28.6kB ± 1%     28.6kB ± 0%     ~     (p=0.151 n=5+5)
JoinReader/reqOrdering=true/matchratio=onetothirtytwo/lookuprows=1/mem=100KB-16                       28.5kB ± 0%     28.6kB ± 0%   +0.26%  (p=0.016 n=5+4)
JoinReader/reqOrdering=true/matchratio=onetothirtytwo/lookuprows=1/mem=unlimited/parallel=true-16     28.5kB ± 0%     28.6kB ± 0%   +0.28%  (p=0.029 n=4+4)
JoinReader/reqOrdering=true/matchratio=onetothirtytwo/lookuprows=1/mem=unlimited-16                   28.6kB ± 0%     28.6kB ± 0%     ~     (p=0.190 n=5+4)
JoinReader/reqOrdering=true/matchratio=onetothirtytwo/lookuprows=16/mem=100KB-16                       135kB ± 0%      136kB ± 0%   +0.43%  (p=0.029 n=4+4)
JoinReader/reqOrdering=true/matchratio=onetothirtytwo/lookuprows=16/mem=unlimited-16                   137kB ± 2%      136kB ± 0%     ~     (p=0.690 n=5+5)
JoinReader/reqOrdering=true/matchratio=onetothirtytwo/lookuprows=256/mem=100KB-16                     2.79MB ± 0%     2.83MB ± 3%   +1.42%  (p=0.016 n=4+5)
JoinReader/reqOrdering=true/matchratio=onetothirtytwo/lookuprows=256/mem=unlimited-16                 1.43MB ± 2%     1.43MB ± 0%     ~     (p=0.286 n=5+4)
JoinReader/reqOrdering=true/matchratio=onetothirtytwo/lookuprows=1024/mem=100KB-16                    9.81MB ± 0%     9.80MB ± 0%     ~     (p=1.000 n=5+5)
JoinReader/reqOrdering=true/matchratio=onetothirtytwo/lookuprows=1024/mem=unlimited-16                4.14MB ± 2%     4.12MB ± 0%     ~     (p=0.905 n=5+4)
JoinReader/reqOrdering=true/matchratio=onetothirtytwo/lookuprows=4096/mem=100KB-16                    38.1MB ± 2%     37.9MB ± 0%     ~     (p=0.905 n=5+4)
JoinReader/reqOrdering=true/matchratio=onetothirtytwo/lookuprows=4096/mem=unlimited-16                14.9MB ± 0%     14.9MB ± 1%     ~     (p=0.548 n=5+5)
JoinReader/reqOrdering=true/matchratio=onetothirtytwo/lookuprows=8192/mem=100KB-16                    75.2MB ± 0%     75.4MB ± 1%     ~     (p=1.000 n=5+5)
JoinReader/reqOrdering=true/matchratio=onetothirtytwo/lookuprows=8192/mem=unlimited-16                29.3MB ± 1%     29.2MB ± 0%     ~     (p=0.730 n=5+4)
JoinReader/reqOrdering=true/matchratio=onetothirtytwo/lookuprows=16384/mem=100KB-16                    152MB ± 1%      152MB ± 2%     ~     (p=1.000 n=5+5)
JoinReader/reqOrdering=true/matchratio=onetothirtytwo/lookuprows=16384/mem=unlimited-16               58.4MB ± 3%     57.9MB ± 0%     ~     (p=0.222 n=5+5)
JoinReader/reqOrdering=true/matchratio=onetosixtyfour/lookuprows=1/mem=100KB/parallel=true-16         31.8kB ± 1%     31.7kB ± 0%     ~     (p=0.690 n=5+5)
JoinReader/reqOrdering=true/matchratio=onetosixtyfour/lookuprows=1/mem=100KB-16                       31.6kB ± 0%     31.7kB ± 0%   +0.35%  (p=0.016 n=4+5)
JoinReader/reqOrdering=true/matchratio=onetosixtyfour/lookuprows=1/mem=unlimited/parallel=true-16     31.7kB ± 1%     31.7kB ± 0%     ~     (p=0.135 n=5+5)
JoinReader/reqOrdering=true/matchratio=onetosixtyfour/lookuprows=1/mem=unlimited-16                   31.6kB ± 0%     31.7kB ± 0%   +0.37%  (p=0.016 n=4+5)
JoinReader/reqOrdering=true/matchratio=onetosixtyfour/lookuprows=16/mem=100KB-16                       469kB ± 2%      467kB ± 0%     ~     (p=0.730 n=5+4)
JoinReader/reqOrdering=true/matchratio=onetosixtyfour/lookuprows=16/mem=unlimited-16                   234kB ± 0%      235kB ± 0%     ~     (p=0.310 n=5+5)
JoinReader/reqOrdering=true/matchratio=onetosixtyfour/lookuprows=256/mem=100KB-16                     5.21MB ± 2%     5.21MB ± 2%     ~     (p=0.548 n=5+5)
JoinReader/reqOrdering=true/matchratio=onetosixtyfour/lookuprows=256/mem=unlimited-16                 2.62MB ± 0%     2.62MB ± 0%     ~     (p=0.056 n=5+5)
JoinReader/reqOrdering=true/matchratio=onetosixtyfour/lookuprows=1024/mem=100KB-16                    18.3MB ± 3%     18.2MB ± 0%     ~     (p=0.151 n=5+5)
JoinReader/reqOrdering=true/matchratio=onetosixtyfour/lookuprows=1024/mem=unlimited-16                7.28MB ± 0%     7.29MB ± 0%     ~     (p=0.114 n=4+4)
JoinReader/reqOrdering=true/matchratio=onetosixtyfour/lookuprows=4096/mem=100KB-16                    70.5MB ± 2%     70.1MB ± 0%     ~     (p=0.690 n=5+5)
JoinReader/reqOrdering=true/matchratio=onetosixtyfour/lookuprows=4096/mem=unlimited-16                26.1MB ± 2%     25.9MB ± 0%     ~     (p=0.413 n=5+4)
JoinReader/reqOrdering=true/matchratio=onetosixtyfour/lookuprows=8192/mem=100KB-16                     140MB ± 1%      139MB ± 0%     ~     (p=0.730 n=5+4)
JoinReader/reqOrdering=true/matchratio=onetosixtyfour/lookuprows=8192/mem=unlimited-16                50.8MB ± 0%     50.8MB ± 0%     ~     (p=0.556 n=5+4)
JoinReader/reqOrdering=false/matchratio=onetoone/lookuprows=1/mem=unlimited/parallel=true-16          16.7kB ± 1%     16.7kB ± 0%     ~     (p=0.286 n=5+5)
JoinReader/reqOrdering=false/matchratio=onetoone/lookuprows=1/mem=unlimited-16                        16.7kB ± 1%     16.8kB ± 1%     ~     (p=0.095 n=5+5)
JoinReader/reqOrdering=false/matchratio=onetoone/lookuprows=16/mem=unlimited-16                       30.4kB ± 1%     30.9kB ± 0%     ~     (p=0.159 n=5+4)
JoinReader/reqOrdering=false/matchratio=onetoone/lookuprows=256/mem=unlimited-16                       279kB ± 0%      287kB ± 0%   +2.86%  (p=0.008 n=5+5)
JoinReader/reqOrdering=false/matchratio=onetoone/lookuprows=1024/mem=unlimited-16                     1.06MB ± 0%     1.10MB ± 1%   +3.19%  (p=0.016 n=4+5)
JoinReader/reqOrdering=false/matchratio=onetoone/lookuprows=4096/mem=unlimited-16                     4.85MB ± 0%     5.12MB ± 2%   +5.52%  (p=0.016 n=4+5)
JoinReader/reqOrdering=false/matchratio=onetoone/lookuprows=8192/mem=unlimited-16                     10.0MB ± 0%     10.7MB ± 2%   +6.68%  (p=0.016 n=4+5)
JoinReader/reqOrdering=false/matchratio=onetoone/lookuprows=16384/mem=unlimited-16                    23.4MB ± 0%     24.7MB ± 0%   +5.80%  (p=0.008 n=5+5)
JoinReader/reqOrdering=false/matchratio=onetoone/lookuprows=32768/mem=unlimited-16                    47.3MB ± 3%     49.1MB ± 0%   +3.78%  (p=0.016 n=5+4)
JoinReader/reqOrdering=false/matchratio=onetoone/lookuprows=65536/mem=unlimited-16                    81.7MB ± 0%     83.8MB ± 0%   +2.63%  (p=0.008 n=5+5)
JoinReader/reqOrdering=false/matchratio=onetoone/lookuprows=524288/mem=unlimited-16                    592MB ± 1%      596MB ± 1%     ~     (p=0.222 n=5+5)
JoinReader/reqOrdering=false/matchratio=onetofour/lookuprows=1/mem=unlimited/parallel=true-16         16.9kB ± 0%     16.9kB ± 0%   +0.33%  (p=0.008 n=5+5)
JoinReader/reqOrdering=false/matchratio=onetofour/lookuprows=1/mem=unlimited-16                       16.8kB ± 0%     16.9kB ± 0%   +0.45%  (p=0.016 n=5+4)
JoinReader/reqOrdering=false/matchratio=onetofour/lookuprows=16/mem=unlimited-16                      33.2kB ± 0%     33.7kB ± 0%   +1.59%  (p=0.029 n=4+4)
JoinReader/reqOrdering=false/matchratio=onetofour/lookuprows=256/mem=unlimited-16                      326kB ± 2%      332kB ± 0%   +1.90%  (p=0.008 n=5+5)
JoinReader/reqOrdering=false/matchratio=onetofour/lookuprows=1024/mem=unlimited-16                    1.24MB ± 0%     1.28MB ± 0%   +2.62%  (p=0.008 n=5+5)
JoinReader/reqOrdering=false/matchratio=onetofour/lookuprows=4096/mem=unlimited-16                    6.37MB ± 0%     6.62MB ± 0%   +3.90%  (p=0.016 n=5+4)
JoinReader/reqOrdering=false/matchratio=onetofour/lookuprows=8192/mem=unlimited-16                    16.2MB ± 1%     16.7MB ± 0%   +3.40%  (p=0.016 n=5+4)
JoinReader/reqOrdering=false/matchratio=onetofour/lookuprows=16384/mem=unlimited-16                   45.3MB ± 1%     46.5MB ± 0%   +2.52%  (p=0.016 n=5+4)
JoinReader/reqOrdering=false/matchratio=onetofour/lookuprows=32768/mem=unlimited-16                    104MB ± 0%      106MB ± 0%   +2.28%  (p=0.016 n=4+5)
JoinReader/reqOrdering=false/matchratio=onetofour/lookuprows=65536/mem=unlimited-16                    203MB ± 1%      206MB ± 0%   +1.64%  (p=0.016 n=5+4)
JoinReader/reqOrdering=false/matchratio=onetosixteen/lookuprows=1/mem=unlimited/parallel=true-16      17.7kB ± 0%     17.8kB ± 1%   +0.68%  (p=0.016 n=4+5)
JoinReader/reqOrdering=false/matchratio=onetosixteen/lookuprows=1/mem=unlimited-16                    17.7kB ± 0%     17.8kB ± 0%   +0.37%  (p=0.029 n=4+4)
JoinReader/reqOrdering=false/matchratio=onetosixteen/lookuprows=16/mem=unlimited-16                   47.0kB ± 0%     47.6kB ± 0%   +1.20%  (p=0.016 n=4+5)
JoinReader/reqOrdering=false/matchratio=onetosixteen/lookuprows=256/mem=unlimited-16                   546kB ± 0%      553kB ± 0%   +1.28%  (p=0.016 n=5+4)
JoinReader/reqOrdering=false/matchratio=onetosixteen/lookuprows=1024/mem=unlimited-16                 2.35MB ± 2%     2.39MB ± 3%     ~     (p=0.056 n=5+5)
JoinReader/reqOrdering=false/matchratio=onetosixteen/lookuprows=4096/mem=unlimited-16                 14.8MB ± 1%     15.0MB ± 0%     ~     (p=0.151 n=5+5)
JoinReader/reqOrdering=false/matchratio=onetosixteen/lookuprows=8192/mem=unlimited-16                 42.5MB ± 0%     43.1MB ± 0%   +1.43%  (p=0.029 n=4+4)
JoinReader/reqOrdering=false/matchratio=onetosixteen/lookuprows=16384/mem=unlimited-16                 159MB ± 1%      138MB ± 1%  -13.23%  (p=0.008 n=5+5)
JoinReader/reqOrdering=false/matchratio=onetosixteen/lookuprows=32768/mem=unlimited-16                 371MB ± 1%      343MB ± 0%   -7.39%  (p=0.008 n=5+5)
JoinReader/reqOrdering=false/matchratio=onetothirtytwo/lookuprows=1/mem=unlimited/parallel=true-16    18.9kB ± 0%     19.1kB ± 1%   +0.69%  (p=0.008 n=5+5)
JoinReader/reqOrdering=false/matchratio=onetothirtytwo/lookuprows=1/mem=unlimited-16                  18.9kB ± 0%     19.0kB ± 0%   +0.36%  (p=0.008 n=5+5)
JoinReader/reqOrdering=false/matchratio=onetothirtytwo/lookuprows=16/mem=unlimited-16                 67.8kB ± 4%     67.1kB ± 0%     ~     (p=0.841 n=5+5)
JoinReader/reqOrdering=false/matchratio=onetothirtytwo/lookuprows=256/mem=unlimited-16                 857kB ± 0%      873kB ± 3%   +1.77%  (p=0.016 n=4+5)
JoinReader/reqOrdering=false/matchratio=onetothirtytwo/lookuprows=1024/mem=unlimited-16               4.01MB ± 0%     4.04MB ± 0%   +0.83%  (p=0.016 n=5+4)
JoinReader/reqOrdering=false/matchratio=onetothirtytwo/lookuprows=4096/mem=unlimited-16               26.4MB ± 2%     26.5MB ± 0%     ~     (p=0.151 n=5+5)
JoinReader/reqOrdering=false/matchratio=onetothirtytwo/lookuprows=8192/mem=unlimited-16               78.6MB ± 2%     78.9MB ± 0%     ~     (p=0.190 n=5+4)
JoinReader/reqOrdering=false/matchratio=onetothirtytwo/lookuprows=16384/mem=unlimited-16               259MB ± 1%      260MB ± 0%     ~     (p=0.190 n=5+4)
JoinReader/reqOrdering=false/matchratio=onetosixtyfour/lookuprows=1/mem=unlimited/parallel=true-16    21.0kB ± 0%     21.1kB ± 0%   +0.32%  (p=0.029 n=4+4)
JoinReader/reqOrdering=false/matchratio=onetosixtyfour/lookuprows=1/mem=unlimited-16                  21.0kB ± 0%     21.2kB ± 1%   +0.78%  (p=0.032 n=5+5)
JoinReader/reqOrdering=false/matchratio=onetosixtyfour/lookuprows=16/mem=unlimited-16                 99.4kB ± 0%     99.9kB ± 0%   +0.57%  (p=0.016 n=5+4)
JoinReader/reqOrdering=false/matchratio=onetosixtyfour/lookuprows=256/mem=unlimited-16                1.44MB ± 0%     1.45MB ± 0%   +0.59%  (p=0.008 n=5+5)
JoinReader/reqOrdering=false/matchratio=onetosixtyfour/lookuprows=1024/mem=unlimited-16               7.00MB ± 2%     6.99MB ± 0%     ~     (p=0.730 n=5+4)
JoinReader/reqOrdering=false/matchratio=onetosixtyfour/lookuprows=4096/mem=unlimited-16               47.9MB ± 2%     48.0MB ± 0%     ~     (p=0.190 n=5+4)
JoinReader/reqOrdering=false/matchratio=onetosixtyfour/lookuprows=8192/mem=unlimited-16                147MB ± 0%      148MB ± 1%   +0.85%  (p=0.008 n=5+5)

name                                                                                                old allocs/op  new allocs/op   delta
JoinReader/reqOrdering=true/matchratio=onetoone/lookuprows=1/mem=100KB/parallel=true-16                  125 ± 0%        127 ± 0%   +1.60%  (p=0.016 n=4+5)
JoinReader/reqOrdering=true/matchratio=onetoone/lookuprows=1/mem=100KB-16                                125 ± 0%        127 ± 1%   +1.80%  (p=0.029 n=4+4)
JoinReader/reqOrdering=true/matchratio=onetoone/lookuprows=1/mem=unlimited/parallel=true-16              125 ± 0%        127 ± 0%   +1.60%  (p=0.016 n=4+5)
JoinReader/reqOrdering=true/matchratio=onetoone/lookuprows=1/mem=unlimited-16                            125 ± 0%        127 ± 0%   +1.60%  (p=0.016 n=4+5)
JoinReader/reqOrdering=true/matchratio=onetoone/lookuprows=16/mem=100KB-16                               273 ± 0%        279 ± 0%   +2.20%  (p=0.029 n=4+4)
JoinReader/reqOrdering=true/matchratio=onetoone/lookuprows=16/mem=unlimited-16                           273 ± 0%        279 ± 0%   +2.20%  (p=0.029 n=4+4)
JoinReader/reqOrdering=true/matchratio=onetoone/lookuprows=256/mem=100KB-16                            2.72k ± 0%      2.73k ± 0%   +0.40%  (p=0.016 n=4+5)
JoinReader/reqOrdering=true/matchratio=onetoone/lookuprows=256/mem=unlimited-16                        2.72k ± 0%      2.73k ± 0%   +0.22%  (p=0.016 n=5+4)
JoinReader/reqOrdering=true/matchratio=onetoone/lookuprows=1024/mem=100KB-16                           10.2k ± 0%      10.2k ± 0%     ~     (p=0.343 n=4+4)
JoinReader/reqOrdering=true/matchratio=onetoone/lookuprows=1024/mem=unlimited-16                       10.2k ± 1%      10.2k ± 0%     ~     (p=0.730 n=5+4)
JoinReader/reqOrdering=true/matchratio=onetoone/lookuprows=4096/mem=100KB-16                           39.9k ± 0%      40.7k ± 6%     ~     (p=0.444 n=5+4)
JoinReader/reqOrdering=true/matchratio=onetoone/lookuprows=4096/mem=unlimited-16                       40.0k ± 1%      39.9k ± 0%     ~     (p=0.968 n=5+4)
JoinReader/reqOrdering=true/matchratio=onetoone/lookuprows=8192/mem=100KB-16                           79.5k ± 0%      79.6k ± 0%     ~     (p=0.413 n=4+5)
JoinReader/reqOrdering=true/matchratio=onetoone/lookuprows=8192/mem=unlimited-16                       79.6k ± 0%      79.7k ± 1%     ~     (p=0.730 n=5+5)
JoinReader/reqOrdering=true/matchratio=onetoone/lookuprows=16384/mem=100KB-16                           159k ± 1%       159k ± 0%     ~     (p=0.730 n=5+4)
JoinReader/reqOrdering=true/matchratio=onetoone/lookuprows=16384/mem=unlimited-16                       159k ± 1%       159k ± 0%   -0.23%  (p=0.032 n=5+4)
JoinReader/reqOrdering=true/matchratio=onetoone/lookuprows=32768/mem=100KB-16                           318k ± 0%       336k ± 6%     ~     (p=0.056 n=5+5)
JoinReader/reqOrdering=true/matchratio=onetoone/lookuprows=32768/mem=unlimited-16                       318k ± 0%       318k ± 1%     ~     (p=0.905 n=5+4)
JoinReader/reqOrdering=true/matchratio=onetoone/lookuprows=65536/mem=100KB-16                           635k ± 0%       636k ± 1%     ~     (p=0.111 n=4+5)
JoinReader/reqOrdering=true/matchratio=onetoone/lookuprows=65536/mem=unlimited-16                       667k ± 6%       635k ± 0%     ~     (p=0.690 n=5+5)
JoinReader/reqOrdering=true/matchratio=onetoone/lookuprows=524288/mem=100KB-16                         5.10M ± 1%      5.08M ± 0%     ~     (p=0.310 n=5+5)
JoinReader/reqOrdering=true/matchratio=onetoone/lookuprows=524288/mem=unlimited-16                     5.07M ± 0%      5.07M ± 0%     ~     (p=0.486 n=4+4)
JoinReader/reqOrdering=true/matchratio=onetofour/lookuprows=1/mem=100KB/parallel=true-16                 129 ± 0%        131 ± 0%   +1.55%  (p=0.008 n=5+5)
JoinReader/reqOrdering=true/matchratio=onetofour/lookuprows=1/mem=100KB-16                               129 ± 0%        131 ± 0%   +1.55%  (p=0.008 n=5+5)
JoinReader/reqOrdering=true/matchratio=onetofour/lookuprows=1/mem=unlimited/parallel=true-16             129 ± 0%        131 ± 0%   +1.55%  (p=0.016 n=5+4)
JoinReader/reqOrdering=true/matchratio=onetofour/lookuprows=1/mem=unlimited-16                           129 ± 0%        131 ± 0%   +1.55%  (p=0.016 n=5+4)
JoinReader/reqOrdering=true/matchratio=onetofour/lookuprows=16/mem=100KB-16                              343 ± 0%        366 ± 5%   +6.65%  (p=0.016 n=4+5)
JoinReader/reqOrdering=true/matchratio=onetofour/lookuprows=16/mem=unlimited-16                          361 ± 5%        349 ± 0%     ~     (p=0.698 n=5+4)
JoinReader/reqOrdering=true/matchratio=onetofour/lookuprows=256/mem=100KB-16                           3.60k ± 0%      3.61k ± 0%   +0.37%  (p=0.008 n=5+5)
JoinReader/reqOrdering=true/matchratio=onetofour/lookuprows=256/mem=unlimited-16                       3.59k ± 0%      3.60k ± 0%   +0.25%  (p=0.016 n=4+5)
JoinReader/reqOrdering=true/matchratio=onetofour/lookuprows=1024/mem=100KB-16                          12.9k ± 0%      12.9k ± 0%     ~     (p=0.381 n=4+5)
JoinReader/reqOrdering=true/matchratio=onetofour/lookuprows=1024/mem=unlimited-16                      12.9k ± 0%      12.9k ± 0%   +0.08%  (p=0.032 n=5+4)
JoinReader/reqOrdering=true/matchratio=onetofour/lookuprows=4096/mem=100KB-16                          50.0k ± 1%      49.9k ± 0%     ~     (p=0.556 n=5+4)
JoinReader/reqOrdering=true/matchratio=onetofour/lookuprows=4096/mem=unlimited-16                      49.9k ± 0%      49.9k ± 0%     ~     (p=0.743 n=4+4)
JoinReader/reqOrdering=true/matchratio=onetofour/lookuprows=8192/mem=100KB-16                          99.3k ± 0%      99.3k ± 0%     ~     (p=0.841 n=5+5)
JoinReader/reqOrdering=true/matchratio=onetofour/lookuprows=8192/mem=unlimited-16                      99.4k ± 1%      99.3k ± 0%     ~     (p=0.127 n=5+4)
JoinReader/reqOrdering=true/matchratio=onetofour/lookuprows=16384/mem=100KB-16                          198k ± 0%       198k ± 0%     ~     (p=1.000 n=5+4)
JoinReader/reqOrdering=true/matchratio=onetofour/lookuprows=16384/mem=unlimited-16                      198k ± 0%       199k ± 1%     ~     (p=0.222 n=5+5)
JoinReader/reqOrdering=true/matchratio=onetofour/lookuprows=32768/mem=100KB-16                          396k ± 0%       396k ± 0%     ~     (p=0.730 n=4+5)
JoinReader/reqOrdering=true/matchratio=onetofour/lookuprows=32768/mem=unlimited-16                      395k ± 0%       396k ± 0%     ~     (p=0.343 n=4+4)
JoinReader/reqOrdering=true/matchratio=onetofour/lookuprows=65536/mem=100KB-16                          791k ± 0%       791k ± 0%     ~     (p=1.000 n=5+4)
JoinReader/reqOrdering=true/matchratio=onetofour/lookuprows=65536/mem=unlimited-16                      792k ± 1%       793k ± 1%     ~     (p=0.841 n=5+5)
JoinReader/reqOrdering=true/matchratio=onetosixteen/lookuprows=1/mem=100KB/parallel=true-16              135 ± 0%        141 ± 5%   +4.44%  (p=0.008 n=5+5)
JoinReader/reqOrdering=true/matchratio=onetosixteen/lookuprows=1/mem=100KB-16                            135 ± 0%        137 ± 0%   +1.48%  (p=0.029 n=4+4)
JoinReader/reqOrdering=true/matchratio=onetosixteen/lookuprows=1/mem=unlimited/parallel=true-16          135 ± 0%        137 ± 0%   +1.48%  (p=0.008 n=5+5)
JoinReader/reqOrdering=true/matchratio=onetosixteen/lookuprows=1/mem=unlimited-16                        135 ± 0%        137 ± 0%   +1.48%  (p=0.008 n=5+5)
JoinReader/reqOrdering=true/matchratio=onetosixteen/lookuprows=16/mem=100KB-16                           453 ± 0%        458 ± 0%   +1.19%  (p=0.008 n=5+5)
JoinReader/reqOrdering=true/matchratio=onetosixteen/lookuprows=16/mem=unlimited-16                       453 ± 1%        458 ± 0%   +1.06%  (p=0.016 n=5+4)
JoinReader/reqOrdering=true/matchratio=onetosixteen/lookuprows=256/mem=100KB-16                        10.7k ±10%      10.1k ± 0%     ~     (p=0.690 n=5+5)
JoinReader/reqOrdering=true/matchratio=onetosixteen/lookuprows=256/mem=unlimited-16                    5.03k ± 1%      5.03k ± 0%     ~     (p=0.730 n=5+4)
JoinReader/reqOrdering=true/matchratio=onetosixteen/lookuprows=1024/mem=100KB-16                       37.9k ± 0%      37.9k ± 0%     ~     (p=0.968 n=5+5)
JoinReader/reqOrdering=true/matchratio=onetosixteen/lookuprows=1024/mem=unlimited-16                   17.7k ± 0%      17.8k ± 1%   +0.36%  (p=0.016 n=4+5)
JoinReader/reqOrdering=true/matchratio=onetosixteen/lookuprows=4096/mem=100KB-16                        150k ± 1%       149k ± 1%     ~     (p=1.000 n=5+5)
JoinReader/reqOrdering=true/matchratio=onetosixteen/lookuprows=4096/mem=unlimited-16                   68.6k ± 0%      68.6k ± 0%     ~     (p=0.841 n=5+5)
JoinReader/reqOrdering=true/matchratio=onetosixteen/lookuprows=8192/mem=100KB-16                        298k ± 0%       297k ± 0%     ~     (p=0.111 n=5+4)
JoinReader/reqOrdering=true/matchratio=onetosixteen/lookuprows=8192/mem=unlimited-16                    136k ± 0%       137k ± 1%     ~     (p=0.063 n=4+5)
JoinReader/reqOrdering=true/matchratio=onetosixteen/lookuprows=16384/mem=100KB-16                       594k ± 0%       595k ± 0%   +0.24%  (p=0.016 n=4+5)
JoinReader/reqOrdering=true/matchratio=onetosixteen/lookuprows=16384/mem=unlimited-16                   272k ± 0%       273k ± 1%     ~     (p=0.111 n=4+5)
JoinReader/reqOrdering=true/matchratio=onetosixteen/lookuprows=32768/mem=100KB-16                      1.19M ± 0%      1.19M ± 0%     ~     (p=0.310 n=5+5)
JoinReader/reqOrdering=true/matchratio=onetosixteen/lookuprows=32768/mem=unlimited-16                   544k ± 1%       543k ± 0%     ~     (p=0.286 n=5+4)
JoinReader/reqOrdering=true/matchratio=onetothirtytwo/lookuprows=1/mem=100KB/parallel=true-16            140 ± 0%        142 ± 0%   +1.43%  (p=0.016 n=4+5)
JoinReader/reqOrdering=true/matchratio=onetothirtytwo/lookuprows=1/mem=100KB-16                          140 ± 0%        142 ± 0%   +1.43%  (p=0.016 n=5+4)
JoinReader/reqOrdering=true/matchratio=onetothirtytwo/lookuprows=1/mem=unlimited/parallel=true-16        140 ± 0%        142 ± 0%   +1.43%  (p=0.016 n=4+5)
JoinReader/reqOrdering=true/matchratio=onetothirtytwo/lookuprows=1/mem=unlimited-16                      140 ± 0%        142 ± 0%   +1.43%  (p=0.016 n=5+4)
JoinReader/reqOrdering=true/matchratio=onetothirtytwo/lookuprows=16/mem=100KB-16                         537 ± 0%        545 ± 1%   +1.45%  (p=0.016 n=4+5)
JoinReader/reqOrdering=true/matchratio=onetothirtytwo/lookuprows=16/mem=unlimited-16                     565 ± 8%        543 ± 0%     ~     (p=0.619 n=5+4)
JoinReader/reqOrdering=true/matchratio=onetothirtytwo/lookuprows=256/mem=100KB-16                      16.1k ± 1%      16.2k ± 1%     ~     (p=0.151 n=5+5)
JoinReader/reqOrdering=true/matchratio=onetothirtytwo/lookuprows=256/mem=unlimited-16                  6.18k ± 0%      6.19k ± 0%     ~     (p=0.086 n=4+4)
JoinReader/reqOrdering=true/matchratio=onetothirtytwo/lookuprows=1024/mem=100KB-16                     61.2k ± 0%      61.2k ± 0%     ~     (p=0.556 n=4+5)
JoinReader/reqOrdering=true/matchratio=onetothirtytwo/lookuprows=1024/mem=unlimited-16                 22.0k ± 1%      22.1k ± 1%     ~     (p=0.841 n=5+5)
JoinReader/reqOrdering=true/matchratio=onetothirtytwo/lookuprows=4096/mem=100KB-16                      242k ± 0%       242k ± 0%     ~     (p=0.343 n=4+4)
JoinReader/reqOrdering=true/matchratio=onetothirtytwo/lookuprows=4096/mem=unlimited-16                 85.2k ± 0%      85.3k ± 0%     ~     (p=0.690 n=5+5)
JoinReader/reqOrdering=true/matchratio=onetothirtytwo/lookuprows=8192/mem=100KB-16                      483k ± 0%       483k ± 0%     ~     (p=1.000 n=5+5)
JoinReader/reqOrdering=true/matchratio=onetothirtytwo/lookuprows=8192/mem=unlimited-16                  169k ± 0%       169k ± 0%     ~     (p=0.686 n=4+4)
JoinReader/reqOrdering=true/matchratio=onetothirtytwo/lookuprows=16384/mem=100KB-16                     969k ± 1%       967k ± 1%     ~     (p=0.841 n=5+5)
JoinReader/reqOrdering=true/matchratio=onetothirtytwo/lookuprows=16384/mem=unlimited-16                 339k ± 1%       338k ± 0%     ~     (p=0.222 n=5+5)
JoinReader/reqOrdering=true/matchratio=onetosixtyfour/lookuprows=1/mem=100KB/parallel=true-16            146 ± 0%        148 ± 0%   +1.37%  (p=0.016 n=4+5)
JoinReader/reqOrdering=true/matchratio=onetosixtyfour/lookuprows=1/mem=100KB-16                          146 ± 0%        148 ± 0%   +1.37%  (p=0.016 n=4+5)
JoinReader/reqOrdering=true/matchratio=onetosixtyfour/lookuprows=1/mem=unlimited/parallel=true-16        146 ± 0%        148 ± 0%   +1.37%  (p=0.016 n=4+5)
JoinReader/reqOrdering=true/matchratio=onetosixtyfour/lookuprows=1/mem=unlimited-16                      146 ± 0%        148 ± 0%   +1.37%  (p=0.029 n=4+4)
JoinReader/reqOrdering=true/matchratio=onetosixtyfour/lookuprows=16/mem=100KB-16                       1.99k ± 1%      2.00k ± 1%     ~     (p=0.087 n=5+5)
JoinReader/reqOrdering=true/matchratio=onetosixtyfour/lookuprows=16/mem=unlimited-16                     639 ± 0%        644 ± 0%   +0.72%  (p=0.016 n=5+4)
JoinReader/reqOrdering=true/matchratio=onetosixtyfour/lookuprows=256/mem=100KB-16                      27.1k ± 0%      27.2k ± 0%     ~     (p=0.057 n=4+4)
JoinReader/reqOrdering=true/matchratio=onetosixtyfour/lookuprows=256/mem=unlimited-16                  7.60k ± 0%      7.61k ± 0%     ~     (p=0.056 n=5+5)
JoinReader/reqOrdering=true/matchratio=onetosixtyfour/lookuprows=1024/mem=100KB-16                      105k ± 0%       105k ± 0%     ~     (p=0.314 n=4+4)
JoinReader/reqOrdering=true/matchratio=onetosixtyfour/lookuprows=1024/mem=unlimited-16                 27.2k ± 0%      27.4k ± 2%   +0.57%  (p=0.048 n=4+5)
JoinReader/reqOrdering=true/matchratio=onetosixtyfour/lookuprows=4096/mem=100KB-16                      416k ± 0%       416k ± 0%     ~     (p=0.111 n=4+5)
JoinReader/reqOrdering=true/matchratio=onetosixtyfour/lookuprows=4096/mem=unlimited-16                  106k ± 2%       106k ± 0%     ~     (p=0.190 n=5+4)
JoinReader/reqOrdering=true/matchratio=onetosixtyfour/lookuprows=8192/mem=100KB-16                      830k ± 0%       831k ± 0%     ~     (p=0.686 n=4+4)
JoinReader/reqOrdering=true/matchratio=onetosixtyfour/lookuprows=8192/mem=unlimited-16                  211k ± 1%       212k ± 3%     ~     (p=1.000 n=5+5)
JoinReader/reqOrdering=false/matchratio=onetoone/lookuprows=1/mem=unlimited/parallel=true-16             115 ± 0%        116 ± 0%   +0.87%  (p=0.008 n=5+5)
JoinReader/reqOrdering=false/matchratio=onetoone/lookuprows=1/mem=unlimited-16                           115 ± 0%        116 ± 0%   +0.87%  (p=0.008 n=5+5)
JoinReader/reqOrdering=false/matchratio=onetoone/lookuprows=16/mem=unlimited-16                          247 ± 0%        252 ± 0%   +2.02%  (p=0.029 n=4+4)
JoinReader/reqOrdering=false/matchratio=onetoone/lookuprows=256/mem=unlimited-16                       2.50k ± 0%      2.50k ± 0%   +0.30%  (p=0.016 n=5+4)
JoinReader/reqOrdering=false/matchratio=onetoone/lookuprows=1024/mem=unlimited-16                      9.49k ± 1%      9.51k ± 1%     ~     (p=0.087 n=5+5)
JoinReader/reqOrdering=false/matchratio=onetoone/lookuprows=4096/mem=unlimited-16                      37.4k ± 0%      37.5k ± 0%   +0.22%  (p=0.048 n=4+5)
JoinReader/reqOrdering=false/matchratio=onetoone/lookuprows=8192/mem=unlimited-16                      74.7k ± 0%      74.9k ± 0%     ~     (p=0.111 n=4+5)
JoinReader/reqOrdering=false/matchratio=onetoone/lookuprows=16384/mem=unlimited-16                      156k ± 0%       156k ± 0%     ~     (p=0.111 n=4+5)
JoinReader/reqOrdering=false/matchratio=onetoone/lookuprows=32768/mem=unlimited-16                      323k ± 1%       322k ± 1%     ~     (p=0.310 n=5+5)
JoinReader/reqOrdering=false/matchratio=onetoone/lookuprows=65536/mem=unlimited-16                      645k ± 0%       644k ± 0%     ~     (p=0.222 n=5+5)
JoinReader/reqOrdering=false/matchratio=onetoone/lookuprows=524288/mem=unlimited-16                    5.23M ± 0%      5.23M ± 0%     ~     (p=0.841 n=5+5)
JoinReader/reqOrdering=false/matchratio=onetofour/lookuprows=1/mem=unlimited/parallel=true-16            117 ± 0%        118 ± 0%   +0.85%  (p=0.008 n=5+5)
JoinReader/reqOrdering=false/matchratio=onetofour/lookuprows=1/mem=unlimited-16                          117 ± 0%        118 ± 0%   +0.85%  (p=0.008 n=5+5)
JoinReader/reqOrdering=false/matchratio=onetofour/lookuprows=16/mem=unlimited-16                         279 ± 0%        284 ± 0%   +1.79%  (p=0.029 n=4+4)
JoinReader/reqOrdering=false/matchratio=onetofour/lookuprows=256/mem=unlimited-16                      3.01k ± 0%      3.02k ± 0%   +0.26%  (p=0.016 n=4+5)
JoinReader/reqOrdering=false/matchratio=onetofour/lookuprows=1024/mem=unlimited-16                     11.5k ± 0%      11.5k ± 0%     ~     (p=0.071 n=5+5)
JoinReader/reqOrdering=false/matchratio=onetofour/lookuprows=4096/mem=unlimited-16                     47.3k ± 0%      47.3k ± 0%   +0.06%  (p=0.029 n=4+4)
JoinReader/reqOrdering=false/matchratio=onetofour/lookuprows=8192/mem=unlimited-16                      101k ± 0%       101k ± 1%     ~     (p=1.000 n=5+5)
JoinReader/reqOrdering=false/matchratio=onetofour/lookuprows=16384/mem=unlimited-16                     229k ± 1%       228k ± 0%     ~     (p=0.286 n=5+4)
JoinReader/reqOrdering=false/matchratio=onetofour/lookuprows=32768/mem=unlimited-16                     495k ± 0%       495k ± 0%     ~     (p=0.286 n=4+5)
JoinReader/reqOrdering=false/matchratio=onetofour/lookuprows=65536/mem=unlimited-16                    1.01M ± 0%      1.04M ± 0%   +3.38%  (p=0.016 n=5+4)
JoinReader/reqOrdering=false/matchratio=onetosixteen/lookuprows=1/mem=unlimited/parallel=true-16         120 ± 0%        121 ± 0%   +0.83%  (p=0.016 n=4+5)
JoinReader/reqOrdering=false/matchratio=onetosixteen/lookuprows=1/mem=unlimited-16                       120 ± 0%        121 ± 0%   +0.83%  (p=0.008 n=5+5)
JoinReader/reqOrdering=false/matchratio=onetosixteen/lookuprows=16/mem=unlimited-16                      328 ± 0%        332 ± 0%   +1.34%  (p=0.008 n=5+5)
JoinReader/reqOrdering=false/matchratio=onetosixteen/lookuprows=256/mem=unlimited-16                   3.78k ± 0%      3.79k ± 0%   +0.18%  (p=0.016 n=5+4)
JoinReader/reqOrdering=false/matchratio=onetosixteen/lookuprows=1024/mem=unlimited-16                  15.1k ± 0%      15.2k ± 1%     ~     (p=0.095 n=4+5)
JoinReader/reqOrdering=false/matchratio=onetosixteen/lookuprows=4096/mem=unlimited-16                  69.7k ± 0%      69.7k ± 0%     ~     (p=0.730 n=4+5)
JoinReader/reqOrdering=false/matchratio=onetosixteen/lookuprows=8192/mem=unlimited-16                   167k ± 1%       166k ± 0%     ~     (p=0.730 n=5+4)
JoinReader/reqOrdering=false/matchratio=onetosixteen/lookuprows=16384/mem=unlimited-16                  633k ± 1%       441k ± 1%  -30.36%  (p=0.008 n=5+5)
JoinReader/reqOrdering=false/matchratio=onetosixteen/lookuprows=32768/mem=unlimited-16                 2.09M ± 1%      1.04M ± 1%  -50.57%  (p=0.008 n=5+5)
JoinReader/reqOrdering=false/matchratio=onetothirtytwo/lookuprows=1/mem=unlimited/parallel=true-16       122 ± 0%        123 ± 0%   +0.82%  (p=0.008 n=5+5)
JoinReader/reqOrdering=false/matchratio=onetothirtytwo/lookuprows=1/mem=unlimited-16                     122 ± 0%        123 ± 0%   +0.82%  (p=0.008 n=5+5)
JoinReader/reqOrdering=false/matchratio=onetothirtytwo/lookuprows=16/mem=unlimited-16                    374 ±12%        364 ± 0%     ~     (p=1.000 n=5+5)
JoinReader/reqOrdering=false/matchratio=onetothirtytwo/lookuprows=256/mem=unlimited-16                 4.29k ± 0%      4.33k ± 2%   +0.90%  (p=0.016 n=4+5)
JoinReader/reqOrdering=false/matchratio=onetothirtytwo/lookuprows=1024/mem=unlimited-16                18.0k ± 0%      18.1k ± 1%     ~     (p=0.222 n=5+5)
JoinReader/reqOrdering=false/matchratio=onetothirtytwo/lookuprows=4096/mem=unlimited-16                91.8k ± 0%      91.7k ± 0%     ~     (p=1.000 n=4+4)
JoinReader/reqOrdering=false/matchratio=onetothirtytwo/lookuprows=8192/mem=unlimited-16                 237k ± 0%       237k ± 0%     ~     (p=0.343 n=4+4)
JoinReader/reqOrdering=false/matchratio=onetothirtytwo/lookuprows=16384/mem=unlimited-16                691k ± 1%       689k ± 0%     ~     (p=0.730 n=5+4)
JoinReader/reqOrdering=false/matchratio=onetosixtyfour/lookuprows=1/mem=unlimited/parallel=true-16       123 ± 0%        124 ± 0%   +0.81%  (p=0.016 n=5+4)
JoinReader/reqOrdering=false/matchratio=onetosixtyfour/lookuprows=1/mem=unlimited-16                     123 ± 0%        124 ± 0%   +1.14%  (p=0.008 n=5+5)
JoinReader/reqOrdering=false/matchratio=onetosixtyfour/lookuprows=16/mem=unlimited-16                    375 ± 0%        381 ± 1%   +1.71%  (p=0.016 n=4+5)
JoinReader/reqOrdering=false/matchratio=onetosixtyfour/lookuprows=256/mem=unlimited-16                 4.91k ± 0%      4.92k ± 0%     ~     (p=0.111 n=5+5)
JoinReader/reqOrdering=false/matchratio=onetosixtyfour/lookuprows=1024/mem=unlimited-16                21.3k ± 1%      21.1k ± 0%     ~     (p=0.190 n=5+4)
JoinReader/reqOrdering=false/matchratio=onetosixtyfour/lookuprows=4096/mem=unlimited-16                 124k ± 0%       125k ± 2%     ~     (p=0.111 n=4+5)
JoinReader/reqOrdering=false/matchratio=onetosixtyfour/lookuprows=8192/mem=unlimited-16                 355k ± 0%       356k ± 1%     ~     (p=0.095 n=5+5)

Reviewable status: :shipit: complete! 0 of 0 LGTMs obtained (and 2 stale) (waiting on @asubiotto and @rytaft)

Copy link
Member

@yuzefovich yuzefovich left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Great, thanks!

Reviewed 2 of 2 files at r6.
Reviewable status: :shipit: complete! 0 of 0 LGTMs obtained (and 2 stale) (waiting on @asubiotto and @sumeerbhola)


pkg/sql/rowexec/utils_test.go, line 185 at r6 (raw file):

func (r *rowDisposer) DrainMeta(context.Context) []execinfrapb.ProducerMetadata {
	meta := r.bufferedMeta

I wonder what prompted this change.

Copy link
Collaborator Author

@sumeerbhola sumeerbhola left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Reviewable status: :shipit: complete! 0 of 0 LGTMs obtained (and 2 stale) (waiting on @asubiotto and @yuzefovich)


pkg/sql/rowexec/utils_test.go, line 185 at r6 (raw file):

Previously, yuzefovich wrote…

I wonder what prompted this change.

The benchmarks were failing (including on master) because it expects exactly one entry in this slice https://github.com/cockroachdb/cockroach/blob/master/pkg/sql/rowexec/joinreader_test.go#L1088 and that isn't true when the benchmark runs for multiple iterations.
I noticed that MetadataSource says DrainMeta is called exactly once. We are violating that in the benchmark, but "reset" behavior seemed close enough.

Copy link
Member

@yuzefovich yuzefovich left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Reviewable status: :shipit: complete! 0 of 0 LGTMs obtained (and 2 stale) (waiting on @asubiotto and @sumeerbhola)


pkg/sql/rowexec/utils_test.go, line 185 at r6 (raw file):

Previously, sumeerbhola wrote…

The benchmarks were failing (including on master) because it expects exactly one entry in this slice https://github.com/cockroachdb/cockroach/blob/master/pkg/sql/rowexec/joinreader_test.go#L1088 and that isn't true when the benchmark runs for multiple iterations.
I noticed that MetadataSource says DrainMeta is called exactly once. We are violating that in the benchmark, but "reset" behavior seemed close enough.

Makes sense.

@sumeerbhola
Copy link
Collaborator Author

bors r+

@craig
Copy link
Contributor

craig bot commented Sep 29, 2020

Build succeeded:

@craig craig bot merged commit cfcc947 into cockroachdb:master Sep 29, 2020
@sumeerbhola sumeerbhola deleted the left_join branch September 30, 2020 13:00
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

4 participants