INDEXED BY 片語強制 SQLite 查詢規劃器 在 DELETE、SELECT 或 UPDATE 陳述式中使用特定命名索引。INDEXED BY 片語是 SQLite 的擴充,無法移植到其他 SQL 資料庫引擎。
"INDEXED BY index-name" 片語指定必須使用命名索引才能在先前表格中查詢值。如果 index-name 不存在或無法用於查詢,則 SQL 陳述式的準備會失敗。"NOT INDEXED" 子句指定在存取先前表格時不得使用任何索引,包括由 UNIQUE 和 PRIMARY KEY 約束建立的隱含索引。不過,即使指定了 "NOT INDEXED",仍可以使用 rowid 來查詢項目。
有些 SQL 資料庫引擎提供非標準的「提示」機制,可用於向查詢最佳化器提供提示,說明它應針對特定陳述式使用哪些索引。SQLite 的 INDEXED BY 子句不是提示機制,不應當作提示機制使用。INDEXED BY 子句不會向最佳化器提供有關要使用哪個索引的提示;它會向最佳化器提供有關要使用哪個索引的要求。如果查詢最佳化器無法使用 INDEXED BY 子句指定的索引,則查詢會失敗並傳回錯誤訊息。
INDEXED BY 子句不用於調整查詢效能。INDEXED BY 子句的目的是在發生架構變更(例如刪除或建立索引)導致時效性查詢的查詢計畫變更時,引發執行時期錯誤。INDEXED BY 子句用於在回歸測試期間偵測不良的查詢計畫變更。建議應用程式開發人員在應用程式設計、實作、測試和調整期間,省略所有 INDEXED BY 用法。如果要使用 INDEXED BY,應在「鎖定」設計的開發流程最末端插入。
查詢規劃器檢查清單說明應用程式開發人員應遵循的步驟,以協助解決查詢規劃器問題。請注意,使用 INDEXED BY 是最後的手段,僅在所有其他措施都失敗時才使用。
一元「+」運算子可從索引中取消 WHERE 子句中的項目資格。謹慎使用一元 + 有時可以防止查詢規劃器選取不佳的索引,而不會限制它使用一個特定索引。謹慎放置一元 + 運算子是控制查詢使用哪些索引的較佳方法。
sqlite3_stmt_status() C/C++ 介面與 SQLITE_STMTSTATUS_FULLSCAN_STEP 和 SQLITE_STMTSTATUS_SORT 動詞可於執行時期偵測 SQL 陳述式何時未有效使用索引。許多應用程式可能偏好使用 sqlite3_stmt_status() 介面來偵測索引誤用,而非本文所述的 INDEXED BY 片語。
此頁面最後修改於 2022-01-08 05:02:57 UTC