函式波動性

在 Spanner 中,函式 (包括內建 SQL 和使用者定義函式) 會依據揮發性分類。波動性類別會指出使用相同引數呼叫函式時,函式是否會傳回相同結果。這項分類會影響查詢最佳化工具處理函式的方式,以及您可以使用函式的位置,例如在產生的資料欄運算式或索引定義中。瞭解函式波動性有助於在 Spanner 中編寫更可預測且效能良好的查詢和結構定義。

共有三種揮發性類別,與 PostgreSQL 等系統中的概念類似:

  • 不可變動:如果使用相同引數值呼叫函式時,函式會傳回相同結果,則該函式為不可變動。這表示函式的結果只取決於輸入引數,而非資料庫狀態、工作階段設定或外部因素。大多數數學函式都是不可變動的。以下是函式範例:

    • ABS

    • LENGTH

    • 字串操控函式,例如 CONCATLOWER

    • 使用明確輸入內容的日期和時間格式化函式

    依附於可透過執行階段設定的函式 (例如時區) 並非不可變動,因為這些函式的結果可能會因不同的資料庫或工作階段設定而異。

  • 穩定:如果函式在單一陳述式執行期間,針對相同引數值傳回相同結果,則該函式為穩定函式。不過,不同 SQL 陳述式的結果可能會有所不同。CURRENT_TIMESTAMPCURRENT_DATE 和類似的以時間為準函式都穩定運作。舉例來說,在同一個 SELECT 陳述式中多次呼叫 CURRENT_TIMESTAMP 會產生相同時間戳記,但後續陳述式可能會產生不同時間戳記。

  • 不穩定:如果函式的值即使在單一陳述式執行期間,使用相同引數時也會變更,則該函式為不穩定。舉例來說,產生專屬 ID 的 GENERATE_UUID 函式是揮發性函式。

波動性影響

函式的變動性類別會決定函式在資料庫結構定義中的使用位置,以及含有函式的查詢最佳化方式:

  • 產生的資料欄:定義產生的資料欄的運算式必須是不可變動的。這可確保儲存的值是根據資料列中的其他資料欄決定。如果您嘗試使用非不可變動的運算式定義產生的資料欄,Spanner 會產生錯誤。

  • 建立索引:您無法在涉及不穩定函式的運算式上建立索引。如果您嘗試在涉及不穩定函式的運算式上建立索引,Spanner 會產生錯誤。

  • 查詢最佳化:查詢最佳化工具會使用波動資訊執行最佳化作業。舉例來說,查詢最佳化工具會預先計算對具有常數引數的不變函式的呼叫。最佳化工具通常會在單一陳述式執行範圍內,快取穩定函式的結果。