fix: Optimize SHOW FIELD KEY CARDINALITY (#23871)

Use the _fieldKeys system iterator

closes https://github.com/influxdata/influxdb/issues/23840
pull/23875/head
davidby-influx 2022-11-08 08:32:10 -08:00 committed by GitHub
parent 1d92b7a8fc
commit f5da0f50f4
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 44 additions and 3 deletions

View File

@ -75,19 +75,33 @@ func rewriteShowFieldKeyCardinalityStatement(stmt *influxql.ShowFieldKeyCardinal
Args: []influxql.Expr{
&influxql.Call{
Name: "distinct",
Args: []influxql.Expr{&influxql.VarRef{Val: "_fieldKey"}},
Args: []influxql.Expr{&influxql.VarRef{Val: "fieldKey"}},
},
},
},
Alias: "count",
},
},
Sources: rewriteSources2(stmt.Sources, stmt.Database),
Condition: stmt.Condition,
Dimensions: stmt.Dimensions,
OmitTime: true,
Offset: stmt.Offset,
Limit: stmt.Limit,
OmitTime: true,
Sources: influxql.Sources{
&influxql.SubQuery{
Statement: &influxql.SelectStatement{
Fields: influxql.Fields([]*influxql.Field{
{Expr: &influxql.VarRef{Val: "fieldKey"}},
{Expr: &influxql.VarRef{Val: "fieldType"}},
}),
Sources: rewriteSources(stmt.Sources, "_fieldKeys", stmt.Database),
Condition: rewriteSourcesCondition(stmt.Sources, nil),
OmitTime: true,
Dedupe: true,
IsRawQuery: true,
},
},
},
}, nil
}

View File

@ -52,6 +52,22 @@ func TestRewriteStatement(t *testing.T) {
stmt: `SHOW FIELD KEYS ON db0 FROM mydb.myrp2./c.*/`,
s: `SELECT fieldKey, fieldType FROM mydb.myrp2._fieldKeys WHERE _name =~ /c.*/`,
},
{
stmt: "SHOW FIELD KEY CARDINALITY",
s: "SELECT count(distinct(fieldKey)) AS count FROM (SELECT fieldKey, fieldType FROM _fieldKeys WHERE _name =~ /.+/)",
},
{
stmt: "SHOW FIELD KEY CARDINALITY ON db0",
s: "SELECT count(distinct(fieldKey)) AS count FROM (SELECT fieldKey, fieldType FROM db0.._fieldKeys WHERE _name =~ /.+/)",
},
{
stmt: "SHOW FIELD KEY CARDINALITY ON db0 FROM /tsm1.*/",
s: "SELECT count(distinct(fieldKey)) AS count FROM (SELECT fieldKey, fieldType FROM db0.._fieldKeys WHERE _name =~ /tsm1.*/)",
},
{
stmt: "SHOW FIELD KEY CARDINALITY ON db0 FROM /tsm1.*/ WHERE 1 = 1",
s: "SELECT count(distinct(fieldKey)) AS count FROM (SELECT fieldKey, fieldType FROM db0.._fieldKeys WHERE _name =~ /tsm1.*/) WHERE 1 = 1",
},
{
stmt: `SHOW SERIES`,
s: `SELECT "key" FROM _series`,

View File

@ -2316,6 +2316,17 @@ const (
// NewFieldKeysIterator returns an iterator that can be iterated over to
// retrieve field keys.
func NewFieldKeysIterator(sh *Shard, opt query.IteratorOptions) (query.Iterator, error) {
const fieldKey = `fieldKey`
const fieldKeyType = `fieldType`
if len(opt.Aux) != 2 {
return nil, fmt.Errorf("wrong number of field arguments for Field Keys iterator. Expected 2, got %d", len(opt.Aux))
}
if opt.Aux[0].Val != fieldKey || opt.Aux[1].Val != fieldKeyType {
return nil,
fmt.Errorf("incorrect fields specified for Field Keys iterator: expected %s, got %s and expected %s, got %s",
fieldKey, opt.Aux[0].Val, fieldKeyType, opt.Aux[1].Val)
}
itr := &fieldKeysIterator{shard: sh}
index, err := sh.Index()