-
Notifications
You must be signed in to change notification settings - Fork 3.8k
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
stats: table setting to turn auto stats collection on/off
Fixes #40989 Previously, there was no way to enable or disable automatic statistics collection at the table level. It could only be turned on or off via the `sql.stats.automatic_collection.enabled` cluster setting. This was inadequate because statistics collection can be expensive for large tables, and it would be desirable to defer collection until after data is finished loading, or in off hours. Also, small tables which are frequently updated may trigger statistics collection leading to unnecessary overhead and/or unpredictable query plan changes. To address this, this patch adds support for setting of the following cluster settings at the table level: ``` sql_stats_automatic_collection_enabled sql_stats_automatic_collection_min_stale_rows sql_stats_automatic_collection_fraction_stale_rows ``` which correspond to the similarly-named cluster settings: ``` sql.stats.automatic_collection.enabled sql.stats.automatic_collection.min_stale_rows sql.stats.automatic_collection.fraction_stale_rows ``` for example: ``` ALTER TABLE t1 SET (sql_stats_automatic_collection_enabled = true); ALTER TABLE t1 SET (sql_stats_automatic_collection_fraction_stale_rows = 0.1, sql_stats_automatic_collection_min_stale_rows = 2000); ``` The table-level setting takes precedence over the cluster setting. Release justification: Low risk fix for missing fine-grained control over automatic statistics collection. Release note (sql change): Automatic statistics collection can now be enabled or disabled for individual tables, taking precedence over the cluster setting, for example: ``` ALTER TABLE t1 SET (sql_stats_automatic_collection_enabled = true); ALTER TABLE t1 SET (sql_stats_automatic_collection_enabled = false); ALTER TABLE t1 RESET (sql_stats_automatic_collection_enabled); ``` RESET removes the setting value entirely, in which case the similarly-name cluster setting, `sql.stats.automatic_collection.enabled`, is in effect for the table. Cluster settings `sql.stats.automatic_collection.fraction_stale_rows` and `sql.stats.automatic_collection.min_stale_rows` now also have table setting counterparts: ``` sql_stats_automatic_collection_fraction_stale_rows sql_stats_automatic_collection_min_stale_rows ``` The table settings may be set at table creation time, or later via ALTER TABLE ... SET, independent of whether auto stats is enabled: ``` ALTER TABLE t1 SET (sql_stats_automatic_collection_fraction_stale_rows = 0.1, sql_stats_automatic_collection_min_stale_rows = 2000); CREATE TABLE t1 (a INT, b INT) WITH (sql_stats_automatic_collection_enabled = true, sql_stats_automatic_collection_min_stale_rows = 1000000, sql_stats_automatic_collection_fraction_stale_rows= 0.05 ); ``` The current table settings (storage parameters) are shown in the `WITH` clause output of `SHOW CREATE TABLE`. Note, any row mutations which have occurred a minute or two before disabling auto stats collection via `ALTER TABLE ... SET` may trigger stats collection, though DML submitted after the setting change will not.
- Loading branch information
Mark Sirek
committed
Apr 4, 2022
1 parent
6f5fb5e
commit 629a6c2
Showing
19 changed files
with
1,100 additions
and
70 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,92 @@ | ||
// Copyright 2022 The Cockroach Authors. | ||
// | ||
// Use of this software is governed by the Business Source License | ||
// included in the file licenses/BSL.txt. | ||
// | ||
// As of the Change Date specified in that file, in accordance with | ||
// the Business Source License, use of this software will be governed | ||
// by the Apache License, Version 2.0, included in the file | ||
// licenses/APL.txt. | ||
|
||
package catpb | ||
|
||
// AutoStatsCollectionStatus represents whether the auto stats collections | ||
// enabled table setting is enabled, disabled, or not set. | ||
type AutoStatsCollectionStatus int | ||
|
||
// The values for AutoStatsCollectionStatus. | ||
const ( | ||
AutoStatsCollectionNotSet AutoStatsCollectionStatus = iota | ||
AutoStatsCollectionEnabled | ||
AutoStatsCollectionDisabled | ||
) | ||
|
||
const ( | ||
// AutoStatsEnabledSettingName is the name of the automatic stats collection | ||
// enabled cluster setting. | ||
AutoStatsEnabledSettingName = "sql.stats.automatic_collection.enabled" | ||
|
||
// AutoStatsEnabledTableSettingName is the name of the automatic stats | ||
// collection enabled table setting. | ||
AutoStatsEnabledTableSettingName = "sql_stats_automatic_collection_enabled" | ||
|
||
// AutoStatsMinStaleSettingName is the name of the automatic stats collection | ||
// min stale rows cluster setting. | ||
AutoStatsMinStaleSettingName = "sql.stats.automatic_collection.min_stale_rows" | ||
|
||
// AutoStatsMinStaleTableSettingName is the name of the automatic stats collection | ||
// min stale rows table setting. | ||
AutoStatsMinStaleTableSettingName = "sql_stats_automatic_collection_min_stale_rows" | ||
|
||
// AutoStatsFractionStaleSettingName is the name of the automatic stats | ||
// collection fraction stale rows cluster setting. | ||
AutoStatsFractionStaleSettingName = "sql.stats.automatic_collection.fraction_stale_rows" | ||
|
||
// AutoStatsFractionStaleTableSettingName is the name of the automatic stats | ||
// collection fraction stale rows table setting. | ||
AutoStatsFractionStaleTableSettingName = "sql_stats_automatic_collection_fraction_stale_rows" | ||
) | ||
|
||
// AutoStatsCollectionEnabled indicates if automatic statistics collection is | ||
// explicitly enabled or disabled. | ||
func (as *AutoStatsSettings) AutoStatsCollectionEnabled() AutoStatsCollectionStatus { | ||
if as.Enabled == nil { | ||
return AutoStatsCollectionNotSet | ||
} | ||
if *as.Enabled { | ||
return AutoStatsCollectionEnabled | ||
} | ||
return AutoStatsCollectionDisabled | ||
} | ||
|
||
// AutoStatsMinStaleRows indicates the setting of | ||
// sql_stats_automatic_collection_min_stale_rows in AutoStatsSettings. If ok is | ||
// true, then the minStaleRows value is valid, otherwise this has not been set. | ||
func (as *AutoStatsSettings) AutoStatsMinStaleRows() (minStaleRows int64, ok bool) { | ||
if as.MinStaleRows == nil { | ||
return 0, false | ||
} | ||
return *as.MinStaleRows, true | ||
} | ||
|
||
// AutoStatsFractionStaleRows indicates the setting of | ||
// sql_stats_automatic_collection_fraction_stale_rows in AutoStatsSettings. If | ||
// ok is true, then the fractionStaleRows value is valid, otherwise this has not | ||
// been set. | ||
func (as *AutoStatsSettings) AutoStatsFractionStaleRows() (fractionStaleRows float64, ok bool) { | ||
if as.FractionStaleRows == nil { | ||
return 0, false | ||
} | ||
return *as.FractionStaleRows, true | ||
} | ||
|
||
// NoAutoStatsSettingsOverrides is true if no auto stats related table | ||
// settings are present in these AutoStatsSettings. | ||
func (as *AutoStatsSettings) NoAutoStatsSettingsOverrides() bool { | ||
if as.Enabled != nil || | ||
as.MinStaleRows != nil || | ||
as.FractionStaleRows != nil { | ||
return false | ||
} | ||
return true | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Oops, something went wrong.