fix: Optimize SHOW FIELD KEY CARDINALITY (#23871)
Use the _fieldKeys system iterator closes https://github.com/influxdata/influxdb/issues/23840pull/23875/head
parent
1d92b7a8fc
commit
f5da0f50f4
|
@ -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
|
||||
}
|
||||
|
||||
|
|
|
@ -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`,
|
||||
|
|
|
@ -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()
|
||||
|
|
Loading…
Reference in New Issue