diff --git a/tsdb/querier_bench_test.go b/tsdb/querier_bench_test.go index 48e73fe85..9efd3f0dd 100644 --- a/tsdb/querier_bench_test.go +++ b/tsdb/querier_bench_test.go @@ -14,6 +14,7 @@ package tsdb import ( + "fmt" "io/ioutil" "os" "strconv" @@ -123,3 +124,56 @@ func benchmarkPostingsForMatchers(b *testing.B, ir IndexReader) { }) } } + +func BenchmarkQuerierSelect(b *testing.B) { + h, err := NewHead(nil, nil, nil, 1000) + testutil.Ok(b, err) + defer h.Close() + app := h.Appender() + numSeries := 1000000 + for i := 0; i < numSeries; i++ { + app.Add(labels.FromStrings("foo", "bar", "i", fmt.Sprintf("%d%s", i, postingsBenchSuffix)), int64(i), 0) + } + testutil.Ok(b, app.Commit()) + + bench := func(b *testing.B, br BlockReader) { + matcher := labels.MustNewMatcher(labels.MatchEqual, "foo", "bar") + for s := 1; s <= numSeries; s *= 10 { + b.Run(fmt.Sprintf("%dof%d", s, numSeries), func(b *testing.B) { + q, err := NewBlockQuerier(br, 0, int64(s-1)) + testutil.Ok(b, err) + + b.ResetTimer() + for i := 0; i < b.N; i++ { + ss, err := q.Select(matcher) + testutil.Ok(b, err) + for ss.Next() { + } + testutil.Ok(b, ss.Err()) + } + q.Close() + }) + } + } + + b.Run("Head", func(b *testing.B) { + bench(b, h) + }) + + tmpdir, err := ioutil.TempDir("", "test_benchquerierselect") + testutil.Ok(b, err) + defer func() { + testutil.Ok(b, os.RemoveAll(tmpdir)) + }() + + blockdir := createBlockFromHead(b, tmpdir, h) + block, err := OpenBlock(nil, blockdir, nil) + testutil.Ok(b, err) + defer func() { + testutil.Ok(b, block.Close()) + }() + + b.Run("Block", func(b *testing.B) { + bench(b, block) + }) +}