本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。
CREATE STATISTICS
支援的語法
CREATE STATISTICS [ [ IF NOT EXISTS ] statistics_name ] ON ( expression ) FROM table_name CREATE STATISTICS [ [ IF NOT EXISTS ] statistics_name ] [ ( statistics_kind [, ... ] ) ] ON { column_name | ( expression ) }, { column_name | ( expression ) } [, ...] FROM table_name
說明
CREATE STATISTICS 將建立新的延伸統計資料物件追蹤指定資料表的資料。統計資料物件將在目前資料庫中建立,並由發出 命令的使用者擁有。
CREATE STATISTICS 命令有兩種基本形式。第一個表單允許收集單一表達式的單變量統計資料,提供類似於表達式索引的優點,而不需要索引維護的額外負荷。此表單不允許指定統計資訊類型,因為各種統計資訊類型僅參考多變量統計資訊。命令的第二種形式允許收集多個資料欄和/或表達式的多變量統計資料,選擇性地指定要包含的統計資料類型。此表單也會自動在清單中包含的任何表達式上收集單變量統計資料。
如果指定結構描述名稱 (例如 CREATE STATISTICS myschema.mystat ...),則會在指定的結構描述中建立統計資料物件。否則會在目前的結構描述中建立。如果指定,則統計資料物件的名稱必須與相同結構描述中任何其他統計資料物件的名稱不同。
Parameters
IF NOT EXISTS-
如果已存在同名的統計資料物件,請勿擲回錯誤。在此情況下會發出通知。請注意,這裡只會考慮統計資料物件的名稱,而不是其定義的詳細資訊。指定
IF NOT EXISTS時需要統計資料名稱。 statistics_name-
要建立之統計資料物件的名稱 (選擇性符合結構描述資格)。如果省略名稱,Aurora DSQL 會根據父資料表的名稱和定義的欄名稱 (s) 和/或 expression(s) 來選擇適當的名稱。
statistics_kind-
要在此統計資料物件中運算的多變量統計資料類型。目前支援的類型為
ndistinct,可啟用 n-distinct 統計資訊dependencies,可啟用功能相依性統計資訊,並可mcv啟用大多數常見的值清單。如果省略此子句,則所有支援的統計資料類型都會包含在統計資料物件中。如果統計資料定義包含任何複雜的表達式,而不只是簡單的資料欄參考,則會自動建置單變量表達式統計資料。 column_name-
要由計算的統計資料涵蓋的資料表資料欄名稱。只有在建置多變量統計資料時,才允許這麼做。至少必須指定兩個資料欄名稱或表達式,而且其順序不重要。
表達式-
要由計算的統計資料涵蓋的表達式。這可用於在單一表達式上建置單變數統計資訊,或做為多個資料欄名稱和/或表達式清單的一部分,以建置多變數統計資訊。在後者案例中,會自動為清單中的每個表達式建立個別的單變數統計資料。
table_name-
包含計算統計資料之資料欄的資料表名稱 (選擇性符合結構描述)。
備註
您必須是資料表的擁有者,才能建立統計資料物件進行讀取。不過,建立後,統計資料物件的擁有權會獨立於基礎資料表 (s)。
表達式統計資料是每個表達式,類似於在表達式上建立索引,但它們可避免索引維護的額外負荷。運算式統計資料會自動為統計資料物件定義中的每個運算式建立。
規劃器目前不會使用擴展統計資料來估計資料表聯結的選擇性。
在 Aurora DSQL 中,您可以在單一資料表上建立最多 5 個延伸統計資料物件。如果您超過此限制,Aurora DSQL 會傳回錯誤 more than 5 extended statistics per table are not allowed。如需詳細資訊,請參閱Aurora DSQL 資料庫限制。
範例
建立t1具有兩個功能相依資料欄的資料表,即了解第一個資料欄中的值足以判斷另一個資料欄中的值。然後,功能相依性統計資料會建置在這些資料欄上:
CREATE TABLE t1 ( a int, b int ); INSERT INTO t1 SELECT i/100, i/500 FROM generate_series(1,1000000) s(i); ANALYZE t1; -- the number of matching rows will be drastically underestimated: EXPLAIN ANALYZE SELECT * FROM t1 WHERE (a = 1) AND (b = 0); CREATE STATISTICS s1 (dependencies) ON a, b FROM t1; ANALYZE t1; -- now the row count estimate is more accurate: EXPLAIN ANALYZE SELECT * FROM t1 WHERE (a = 1) AND (b = 0);
如果沒有功能相依性統計資料,規劃器會假設兩個WHERE條件是獨立的,並將其選擇性乘以一起得出much-too-small的資料列計數估計值。使用這類統計資料時,規劃器會辨識WHERE條件是多餘的,而且不會低估資料列計數。
t2 建立具有兩個完美關聯資料欄 (包含相同資料) 的資料表,以及這些資料欄上的 MCV 清單:
CREATE TABLE t2 ( a int, b int ); INSERT INTO t2 SELECT mod(i,100), mod(i,100) FROM generate_series(1,1000000) s(i); CREATE STATISTICS s2 (mcv) ON a, b FROM t2; ANALYZE t2; -- valid combination (found in MCV) EXPLAIN ANALYZE SELECT * FROM t2 WHERE (a = 1) AND (b = 1); -- invalid combination (not found in MCV) EXPLAIN ANALYZE SELECT * FROM t2 WHERE (a = 1) AND (b = 2);
MCV 清單提供規劃器有關資料表中常見特定值的更多詳細資訊,以及資料表中未顯示之值組合的選擇性上限,因此可在兩種情況下產生更好的預估值。