管理向量索引
本文件說明如何建立及管理向量索引,以加快向量搜尋速度。
向量索引是一種資料結構,可讓 VECTOR_SEARCH
函式 更有效率地執行,尤其是在大型資料集上。使用索引時,VECTOR_SEARCH
會使用近似最鄰近搜尋 (ANN) 演算法,以減少查詢延遲時間和運算成本。雖然 ANN 會引入一定程度的近似值,也就是說喚回率可能不會達到 100%,但效能提升通常可為大多數應用程式帶來優勢。
角色和權限
如要建立向量索引,您需要在建立索引的資料表上具備 bigquery.tables.createIndex
IAM 權限。如要放棄向量索引,您必須具備 bigquery.tables.deleteIndex
權限。以下每個預先定義的 IAM 角色都包含使用向量索引所需的權限:
- BigQuery 資料擁有者 (
roles/bigquery.dataOwner
) - BigQuery 資料編輯器 (
roles/bigquery.dataEditor
)
選擇向量索引類型
BigQuery 提供兩種向量索引類型:IVF 和 TreeAH,各自支援不同的用途。BigQuery 會在 VECTOR_SEARCH
函式中處理多列輸入資料,以便支援向量搜尋的批次作業。如果是小型查詢批次,建議使用 IVF 索引。對於大量查詢批次,建議使用 TreeAH 索引,因為這些索引是使用 Google 的 ScaNN 演算法 建構而成。
IVF 索引
IVF 是反向檔案索引,會使用 k-means 演算法將向量資料分群,然後根據這些叢集分割向量資料。VECTOR_SEARCH
函式可使用這些分區,減少需要讀取的資料量,以便判斷結果。
TreeAH 索引
TreeAH 索引類型名稱的由來,是因為它結合了樹狀結構和不對稱雜湊 (AH),這是來自基礎 ScaNN 演算法的核心量化技術。TreeAH 索引的運作方式如下:
- 將基本資料表分割成較小且更易於管理的資料分片。
- 訓練叢集模型,叢集數量取自
CREATE VECTOR INDEX
陳述式tree_ah_options
引數中的leaf_node_embedding_count
選項。 - 向量會透過產品量化技術進行壓縮,這項技術可減少記憶體用量。壓縮向量會儲存在索引表中,而非原始向量,因此可縮減向量索引大小。
- 執行
VECTOR_SEARCH
函式時,系統會使用不對稱雜湊法 (為近似距離計算進行硬體最佳化),有效計算每個查詢向量的候選清單。然後使用精確的嵌入資料重新評分及重新排名。
TreeAH 演算法經過最佳化處理,可處理數百個以上的查詢向量。使用產品量化功能可大幅降低延遲和成本,可能比 IVF 更省錢。不過,由於額外負擔增加,如果查詢向量數量較少,採用 IVF 演算法可能會比較好。
如果您的用途符合下列條件,建議您試試 TreeAH 索引類型:
表格列數少於 2 億列。
經常執行涉及數百個或更多查詢向量的大型批次查詢。
如果是使用 TreeAH 索引類型的小批次查詢,VECTOR_SEARCH
可能會改回暴力搜尋。發生這種情況時,系統會提供 IndexUnusedReason,說明為何未使用向量索引。
建立 IVF 向量索引
如要建立 IVF 向量索引,請使用 CREATE VECTOR INDEX
資料定義語言 (DDL) 陳述式:
前往「BigQuery」頁面
在查詢編輯器中執行下列 SQL 陳述式:
如要建立 IVF 向量索引,請按照下列步驟操作:
CREATE [ OR REPLACE ] VECTOR INDEX [ IF NOT EXISTS ] INDEX_NAME ON DATASET_NAME.TABLE_NAME(COLUMN_NAME) STORING(STORED_COLUMN_NAME [, ...]) OPTIONS(index_type = 'IVF', distance_type = 'DISTANCE_TYPE', ivf_options = '{"num_lists":NUM_LISTS}')
更改下列內容:
INDEX_NAME
:您要建立的向量索引名稱。由於索引一律會在與基礎資料表相同的專案和資料集中建立,因此您不必在名稱中指定這些項目。DATASET_NAME
:包含資料表的資料集名稱。TABLE_NAME
:包含內嵌資料欄的資料表名稱。COLUMN_NAME
:包含嵌入資料的資料欄名稱。該欄的類型必須為ARRAY<FLOAT64>
。該欄不得包含任何子欄位。陣列中的所有元素都必須是非NULL
,且資料欄中的所有值都必須具有相同的陣列維度。STORED_COLUMN_NAME
:資料表中要儲存在向量索引中的頂層欄名稱。欄類型不得為RANGE
。如果資料表有資料列層級存取政策,或是資料欄有政策標記,系統就不會使用儲存的資料欄。如要進一步瞭解如何啟用儲存資料欄,請參閱「儲存資料欄和預先篩選」一文。DISTANCE_TYPE
:指定使用此索引執行向量搜尋時,要使用的預設距離類型。支援的值為EUCLIDEAN
、COSINE
和DOT_PRODUCT
。預設為EUCLIDEAN
。索引建立作業本身一律會使用
EUCLIDEAN
距離進行訓練,但VECTOR_SEARCH
函式使用的距離可能不同。如果您為
VECTOR_SEARCH
函式的distance_type
引數指定值,系統會使用該值,而非DISTANCE_TYPE
值。NUM_LISTS
:INT64
值,可指定 IVF 索引叢集的清單數量,並將向量資料分割成數個部分。這個值必須小於或等於 5,000。在建立索引期間,系統會將向量指派給與最近叢集中心點相對應的清單。如果省略這個引數,BigQuery 會根據資料特性決定預設值。預設值適用於多數用途。NUM_LISTS
可控制查詢調整精細程度。值越高,建立的清單就越多,因此您可以設定VECTOR_SEARCH
函式的fraction_lists_to_search
選項,以掃描索引鍵的較小百分比。舉例來說,掃描 100 個清單中的 1%,而不是掃描 10 個清單中的 10%。這樣一來,您就能更精確地控制搜尋速度和喚回率,但索引成本會稍微增加。請根據您需要調整查詢範圍的精確程度,設定這個引數值。
以下範例會在 my_table
的 embedding
資料欄上建立向量索引:
CREATE TABLE my_dataset.my_table(embedding ARRAY<FLOAT64>); CREATE VECTOR INDEX my_index ON my_dataset.my_table(embedding) OPTIONS(index_type = 'IVF');
以下範例會在 my_table
的 embedding
欄上建立向量索引,並指定要使用的距離類型和 IVF 選項:
CREATE TABLE my_dataset.my_table(embedding ARRAY<FLOAT64>); CREATE VECTOR INDEX my_index ON my_dataset.my_table(embedding) OPTIONS(index_type = 'IVF', distance_type = 'COSINE', ivf_options = '{"num_lists": 2500}')
建立 TreeAH 向量索引
如要建立 TreeAH 向量索引,請使用 CREATE VECTOR INDEX
資料定義語言 (DDL) 陳述式:
前往「BigQuery」頁面
在查詢編輯器中執行下列 SQL 陳述式:
CREATE [ OR REPLACE ] VECTOR INDEX [ IF NOT EXISTS ] INDEX_NAME ON DATASET_NAME.TABLE_NAME(COLUMN_NAME) STORING(STORED_COLUMN_NAME [, ...]) OPTIONS(index_type = 'TREE_AH', distance_type = 'DISTANCE_TYPE', tree_ah_options = '{"leaf_node_embedding_count":LEAF_NODE_EMBEDDING_COUNT, "normalization_type":"NORMALIZATION_TYPE"}')
更改下列內容:
INDEX_NAME
:您要建立的向量索引名稱。由於索引一律會在與基本資料表相同的專案和資料集中建立,因此您不需要在名稱中指定這些項目。DATASET_NAME
:包含資料表的資料集名稱。TABLE_NAME
:包含內嵌資料欄的資料表名稱。COLUMN_NAME
:包含嵌入資料的資料欄名稱。該欄的類型必須為ARRAY<FLOAT64>
。該欄不得包含任何子欄位。陣列中的所有元素都必須是非NULL
,且資料欄中的所有值都必須具有相同的陣列維度。STORED_COLUMN_NAME
:資料表中要儲存在向量索引中的頂層欄名稱。欄類型不得為RANGE
。如果資料表有資料列層級存取政策,或是資料欄有政策標記,系統就不會使用儲存的資料欄。如要進一步瞭解如何啟用儲存資料欄,請參閱「儲存資料欄和預先篩選」一文。DISTANCE_TYPE
:這個選用引數會指定使用此索引執行向量搜尋時要使用的預設距離類型。支援的值為EUCLIDEAN
、COSINE
和DOT_PRODUCT
。預設為EUCLIDEAN
。索引建立作業本身一律會使用
EUCLIDEAN
距離進行訓練,但VECTOR_SEARCH
函式使用的距離可能不同。如果您為
VECTOR_SEARCH
函式的distance_type
引數指定值,系統會使用該值,而非DISTANCE_TYPE
值。LEAF_NODE_EMBEDDING_COUNT
:INT64
值大於或等於 500,可指定 TreeAH 演算法建立的樹狀結構中,每個葉節點的向量數量。TreeAH 演算法會將整個資料空間劃分為多個清單,每個清單都包含約LEAF_NODE_EMBEDDING_COUNT
個資料點。值越低,產生的清單越多,但每個清單的資料點就越少;值越高,產生的清單越少,但每個清單的資料點就越多。預設值為 1,000,適合大多數資料集。NORMALIZATION_TYPE
:STRING
值。支援的值為NONE
或L2
。預設為NONE
。無論是基礎資料表資料或查詢資料,系統都會在任何處理作業之前進行規格化,但不會修改TABLE_NAME
中的嵌入資料欄COLUMN_NAME
。視資料集、嵌入模型和VECTOR_SEARCH
期間使用的距離類型而定,將嵌入值標準化可能會提高回溯率。
下列範例會在 my_table
的 embedding
資料欄上建立向量索引,並指定要使用的距離類型和 TreeAH 選項:
CREATE TABLE my_dataset.my_table(id INT64, embedding ARRAY<FLOAT64>); CREATE VECTOR INDEX my_index ON my_dataset.my_table(embedding) OPTIONS (index_type = 'TREE_AH', distance_type = 'EUCLIDEAN', tree_ah_options = '{"normalization_type": "L2"}');
儲存資料欄和預先篩選
如要進一步提高向量索引的效率,您可以指定要儲存在向量索引中的基礎資料表欄。使用儲存欄可透過下列方式,將呼叫 VECTOR_SEARCH
函式的查詢最佳化:
您可以呼叫
VECTOR_SEARCH
函式,並在查詢陳述式中使用WHERE
子句預先篩選基礎資料表,以便查詢整個資料表。如果資料表含有索引,且您只篩選已儲存的資料欄,BigQuery 會在搜尋前篩選資料,然後使用索引搜尋較小的結果集,藉此最佳化查詢。如果您篩選未儲存的資料欄,BigQuery 會在搜尋資料表後套用篩選器,也就是「後置篩選器」。VECTOR_SEARCH
函式會輸出名為base
的結構體,其中包含基本資料表的所有資料欄。如果沒有儲存的資料欄,您可能需要進行耗時的彙整作業,才能擷取儲存在base
中的資料欄。如果您使用 IVF 索引,且查詢只從base
中選取已儲存的資料欄,BigQuery 會對查詢進行最佳化,以便移除該彙整作業。對於 TreeAH 索引,系統不會移除與主資料表的彙整作業。TreeAH 索引中的儲存資料欄只會用於預先篩選。
如要儲存資料欄,請在 CREATE VECTOR INDEX
DDL 陳述式的 STORING
子句中列出資料欄。儲存資料欄會增加向量索引的大小,因此建議只儲存最常用或經過篩選的資料欄。
以下範例會建立含有已儲存資料欄的向量索引,然後執行只選取已儲存資料欄的向量搜尋查詢:
-- Create a table that contains an embedding. CREATE TABLE my_dataset.my_table(embedding ARRAY<FLOAT64>, type STRING, creation_time DATETIME, id INT64); -- Create a query table that contains an embedding. CREATE TABLE my_dataset.my_testdata(embedding ARRAY<FLOAT64>, test_id INT64); -- Create a vector index with stored columns. CREATE VECTOR INDEX my_index ON my_dataset.my_table(embedding) STORING (type, creation_time) OPTIONS (index_type = 'IVF'); -- Select only stored columns from a vector search to avoid an expensive join. SELECT query, base.type, distance FROM VECTOR_SEARCH( TABLE my_dataset.my_table, 'embedding' TABLE my_dataset.my_testdata);
預先篩選器和後置篩選器
在 BigQuery VECTOR_SEARCH
作業中,預先篩選和事後篩選功能都會根據與向量嵌入項目相關聯的中繼資料欄套用條件,藉此改善搜尋結果。因此,請務必瞭解兩者的差異、實作方式和影響,以便提升查詢效能、成本和準確度。
預先篩選和事後篩選的定義如下:
- 預先篩選:在近似近鄰 (ANN) 搜尋對候選向量執行距離計算之前,套用篩選條件。這樣一來,系統就能縮小搜尋期間考量的向量集。因此,預先篩選通常可縮短查詢時間,並降低運算成本,因為 ANN 搜尋會評估較少的潛在候選項目。
- 後置篩選:在 ANN 搜尋識別出初始
top_k
近鄰後,套用篩選條件。這會根據指定條件精簡最終結果集。
WHERE
子句的位置會決定篩選器是做為前置篩選器還是後置篩選器。
如要建立預先篩選器,查詢的 WHERE
子句必須套用至 VECTOR_SEARCH
函式的基礎資料表引數。述詞必須套用至已儲存的資料欄,否則實際上會成為後置篩選器。
以下範例說明如何建立預先篩選器:
-- Pre-filter on a stored column. The index speeds up the query. SELECT * FROM VECTOR_SEARCH( (SELECT * FROM my_dataset.my_table WHERE type = 'animal'), 'embedding', TABLE my_dataset.my_testdata); -- Filter on a column that isn't stored. The index is used to search the -- entire table, and then the results are post-filtered. You might see fewer -- than 5 matches returned for some embeddings. SELECT query.test_id, base.type, distance FROM VECTOR_SEARCH( (SELECT * FROM my_dataset.my_table WHERE id = 123), 'embedding', TABLE my_dataset.my_testdata, top_k => 5); -- Use pre-filters with brute force. The data is filtered and then searched -- with brute force for exact results. SELECT query.test_id, base.type, distance FROM VECTOR_SEARCH( (SELECT * FROM my_dataset.my_table WHERE id = 123), 'embedding', TABLE my_dataset.my_testdata, options => '{"use_brute_force":true}');
如要建立後置篩選器,請將查詢的 WHERE
子句套用至 VECTOR_SEARCH
函式之外,這樣才能篩選搜尋作業傳回的結果。
以下範例說明如何建立後置篩選器:
-- Use post-filters. The index is used, but the entire table is searched and -- the post-filtering might reduce the number of results. SELECT query.test_id, base.type, distance FROM VECTOR_SEARCH( TABLE my_dataset.my_table, 'embedding', TABLE my_dataset.my_testdata, top_k => 5) WHERE base.type = 'animal'; SELECT base.id, distance FROM VECTOR_SEARCH( TABLE mydataset.base_table, 'embedding', (SELECT embedding FROM mydataset.query_table), top_k => 10 ) WHERE type = 'document' AND year > 2022
使用後置篩選功能,或當您指定的基礎資料表篩選器參照未儲存的資料欄,並因此充當後置篩選器時,如果謂詞是選擇性的,最終結果集可能會包含少於 top_k
的資料列,甚至可能為零。如果您需要篩選後的結果數量,請考慮在 VECTOR_SEARCH
呼叫中指定較大的 top_k
值,或增加 fraction_lists_to_search
值。
在某些情況下,尤其是當預先篩選器非常挑剔時,預先篩選也可減少結果集的大小。如果發生這種情況,請嘗試在 VECTOR_SEARCH
呼叫中增加 fraction_lists_to_search
值。
限制
- 您無法在預篩選器中使用邏輯檢視畫面。
- 如果預先篩選器包含子查詢,可能會影響索引使用情形。
- 如果在基礎資料表中變更資料欄的模式、類型或結構定義,且該資料欄是向量索引中的儲存資料欄,則可能需要一段時間,向量索引才會反映該變更。在更新套用至索引之前,向量搜尋查詢會使用主資料表中經過修改的已儲存資料欄。
- 如果您在具有儲存資料欄的索引資料表上,從
VECTOR_SEARCH
查詢的query
輸出中選取STRUCT
類型的資料欄,整個查詢可能會失敗。
瞭解資料的索引時間
向量索引由 BigQuery 全權管理,並會在索引資料表變更時自動重新整理。
索引建立作業為非同步作業。在基本資料表中新增資料列,與索引中顯示新資料列之間,會有一段時間差。不過,VECTOR_SEARCH
函式仍會考量所有資料列,不會遺漏未編入索引的資料列。這個函式會使用索引搜尋已編入索引的記錄,並使用暴力搜尋尚未編入索引的記錄。
如果您在小於 10 MB 的資料表上建立向量索引,系統就不會填入向量索引。同樣地,如果您從已編入索引的資料表中刪除資料,且資料表大小低於 10 MB,則向量索引會暫時停用。在這種情況下,向量搜尋查詢不會使用索引,且 Job
資源的 vectorSearchStatistics
部分中的 indexUnusedReasons
程式碼為 BASE_TABLE_TOO_SMALL
。沒有索引時,VECTOR_SEARCH
會自動改用暴力搜尋,找出嵌入資料的最近鄰居。
如果您刪除資料表中的索引欄,或重新命名資料表本身,系統會自動刪除向量索引。
監控向量索引狀態
您可以查詢 INFORMATION_SCHEMA
檢視畫面,監控向量索引的健康狀態。下列檢視畫面包含向量索引的中繼資料:
INFORMATION_SCHEMA.VECTOR_INDEXES
檢視畫面會顯示資料集中的向量索引資訊。CREATE VECTOR INDEX
陳述式完成後,您仍必須先填入索引才能使用。您可以使用last_refresh_time
和coverage_percentage
欄來驗證向量索引是否就緒。如果向量索引尚未就緒,您仍可在資料表上使用VECTOR_SEARCH
函式,只是沒有索引的話,執行速度可能會比較慢。INFORMATION_SCHEMA.VECTOR_INDEX_COLUMNS
檢視畫面會顯示資料集中所有資料表的向量索引欄資訊。INFORMATION_SCHEMA.VECTOR_INDEX_OPTIONS
檢視畫面會顯示資料集向量索引使用的選項資訊。
向量索引範例
以下範例會顯示位於專案 my_project
中的資料集 my_dataset
中,所有有效向量索引的資料表。其中包含名稱、用於建立這些項目的 DDL 陳述式,以及涵蓋率百分比。如果索引基礎資料表小於 10 MB,則不會填入索引,此時 coverage_percentage
值為 0。
SELECT table_name, index_name, ddl, coverage_percentage FROM my_project.my_dataset.INFORMATION_SCHEMA.VECTOR_INDEXES WHERE index_status = 'ACTIVE';
顯示類似下列內容:
+------------+------------+-------------------------------------------------------------------------------------------------+---------------------+ | table_name | index_name | ddl | coverage_percentage | +------------+------------+-------------------------------------------------------------------------------------------------+---------------------+ | table1 | indexa | CREATE VECTOR INDEX `indexa` ON `my_project.my_dataset.table1`(embeddings) | 100 | | | | OPTIONS (distance_type = 'EUCLIDEAN', index_type = 'IVF', ivf_options = '{"num_lists": 100}') | | +------------+------------+-------------------------------------------------------------------------------------------------+---------------------+ | table2 | indexb | CREATE VECTOR INDEX `indexb` ON `my_project.my_dataset.table2`(vectors) | 42 | | | | OPTIONS (distance_type = 'COSINE', index_type = 'IVF', ivf_options = '{"num_lists": 500}') | | +------------+------------+-------------------------------------------------------------------------------------------------+---------------------+ | table3 | indexc | CREATE VECTOR INDEX `indexc` ON `my_project.my_dataset.table3`(vectors) | 98 | | | | OPTIONS (distance_type = 'DOT_PRODUCT', index_type = 'TREE_AH', | | | | | tree_ah_options = '{"leaf_node_embedding_count": 1000, "normalization_type": "NONE"}') | | +------------+------------+-------------------------------------------------------------------------------------------------+---------------------+
向量索引欄範例
下列查詢會擷取含有向量索引的資料欄資訊:
SELECT table_name, index_name, index_column_name, index_field_path FROM my_project.dataset.INFORMATION_SCHEMA.VECTOR_INDEX_COLUMNS;
顯示類似下列內容:
+------------+------------+-------------------+------------------+ | table_name | index_name | index_column_name | index_field_path | +------------+------------+-------------------+------------------+ | table1 | indexa | embeddings | embeddings | | table2 | indexb | vectors | vectors | | table3 | indexc | vectors | vectors | +------------+------------+-------------------+------------------+
向量索引選項範例
以下查詢會擷取向量索引選項的相關資訊:
SELECT table_name, index_name, option_name, option_type, option_value FROM my_project.dataset.INFORMATION_SCHEMA.VECTOR_INDEX_OPTIONS;
顯示類似下列內容:
+------------+------------+------------------+------------------+-------------------------------------------------------------------+ | table_name | index_name | option_name | option_type | option_value | +------------+------------+------------------+------------------+-------------------------------------------------------------------+ | table1 | indexa | index_type | STRING | IVF | | table1 | indexa | distance_type | STRING | EUCLIDEAN | | table1 | indexa | ivf_options | STRING | {"num_lists": 100} | | table2 | indexb | index_type | STRING | IVF | | table2 | indexb | distance_type | STRING | COSINE | | table2 | indexb | ivf_options | STRING | {"num_lists": 500} | | table3 | indexc | index_type | STRING | TREE_AH | | table3 | indexc | distance_type | STRING | DOT_PRODUCT | | table3 | indexc | tree_ah_options | STRING | {"leaf_node_embedding_count": 1000, "normalization_type": "NONE"} | +------------+------------+------------------+------------------+-------------------------------------------------------------------+
驗證向量索引使用情形
向量索引使用情形的資訊會顯示在執行向量搜尋查詢的工作中的工作中繼資料中。您可以使用 Google Cloud 主控台、bq 指令列工具、BigQuery API 或用戶端程式庫,查看工作中繼資料。
使用 Google Cloud 主控台時,您可以在「向量索引使用模式」和「向量索引未使用的原因」欄位中,找到向量索引使用資訊。
使用 bq 工具或 BigQuery API 時,您可以在 Job
資源的 VectorSearchStatistics
部分找到向量索引使用資訊。
索引使用模式會指出是否使用向量索引,並提供下列其中一個值:
UNUSED
:未使用向量索引。PARTIALLY_USED
:查詢中部分VECTOR_SEARCH
函式使用向量索引,部分則未使用。FULLY_USED
:查詢中的每個VECTOR_SEARCH
函式都使用向量索引。
當索引使用模式值為 UNUSED
或 PARTIALLY_USED
時,未使用索引的原因會指出為何未在查詢中使用向量索引。
舉例來說,bq show --format=prettyjson -j my_job_id
傳回的以下結果顯示,由於 VECTOR_SEARCH
函式中指定了 use_brute_force
選項,因此未使用索引:
"vectorSearchStatistics": { "indexUnusedReasons": [ { "baseTable": { "datasetId": "my_dataset", "projectId": "my_project", "tableId": "my_table" }, "code": "INDEX_SUPPRESSED_BY_FUNCTION_OPTION", "message": "No vector index was used for the base table `my_project:my_dataset.my_table` because use_brute_force option has been specified." } ], "indexUsageMode": "UNUSED" }
索引管理選項
如要建立索引並由 BigQuery 維護,有兩種方法:
- 使用預設共用運算單元集區:如果您要索引的資料低於每個組織的限制,可以使用免費的共用運算單元集區來管理索引。
- 使用自訂預留項目:如要讓大型實際工作負載的索引進度更可預測且更一致,您可以使用自訂預留項目來管理索引。
使用共用運算單元
如果您尚未設定專案使用專用保留空間進行索引,系統會在免費的共用運算單元集區中處理索引管理作業,但須遵守下列限制。
如果您在資料表中新增資料,導致已編入索引的資料表總大小超過貴機構的限制,BigQuery 會暫停所有已編入索引的資料表的索引管理作業。發生這種情況時,INFORMATION_SCHEMA.VECTOR_INDEXES
檢視畫面中的 index_status
欄位會顯示 PENDING DISABLEMENT
,且索引會排入刪除佇列。在索引處於待停用狀態時,仍會用於查詢,且您必須支付索引儲存空間費用。刪除索引後,index_status
欄位會將索引顯示為 TEMPORARILY DISABLED
。在這個狀態下,查詢不會使用索引,而且您不會被收取索引儲存空間費用。在本例中,IndexUnusedReason
代碼為 BASE_TABLE_TOO_LARGE
。
如果您從資料表中刪除資料,且索引資料表的總大小低於每個組織的限制,則系統會恢復所有已索引資料表的索引管理。INFORMATION_SCHEMA.VECTOR_INDEXES
檢視畫面中的 index_status
欄位為 ACTIVE
,查詢可以使用索引,且您需要支付索引儲存空間費用。
BigQuery 不保證共用集區的可用容量或您所看到的索引處理量。對於正式版應用程式,您可能會想使用專屬的空白來處理索引。
使用自有預留項目
您可以選擇不使用預設的共用運算單元集區,改為指定自己的預留空間來為資料表建立索引。使用自訂預訂功能,可確保索引管理工作 (例如建立、重新整理和背景最佳化) 的效能可預測且一致。
- 在保留空間中執行索引工作時,沒有資料表大小限制。
- 使用自訂保留項目可讓您靈活管理索引。如果您需要建立非常大的索引,或對已編入索引的資料表進行重大更新,可以暫時在指派中新增更多運算單元。
如要在專案中為指定預留項目建立索引,請在資料表所在的區域建立預留項目。接著,將專案指派給預留項目,並將 job_type
設為 BACKGROUND
:
SQL
前往 Google Cloud 控制台的「BigQuery」頁面。
在查詢編輯器中輸入以下陳述式:
CREATE ASSIGNMENT `ADMIN_PROJECT_ID.region-LOCATION.RESERVATION_NAME.ASSIGNMENT_ID` OPTIONS ( assignee = 'projects/PROJECT_ID', job_type = 'BACKGROUND');
請依指示取代下列項目:
按一下
「Run」。
如要進一步瞭解如何執行查詢,請參閱「執行互動式查詢」一文。
bq
使用 bq mk
指令:
bq mk \ --project_id=ADMIN_PROJECT_ID \ --location=LOCATION \ --reservation_assignment \ --reservation_id=RESERVATION_NAME \ --assignee_id=PROJECT_ID \ --job_type=BACKGROUND \ --assignee_type=PROJECT
更改下列內容:
查看索引工作
每次在單一資料表上建立或更新索引時,系統都會建立新的索引工作。如要查看工作相關資訊,請查詢 INFORMATION_SCHEMA.JOBS*
檢視表。您可以在查詢的 WHERE
子句中設定 job_type IS NULL AND SEARCH(job_id, '`search_index`')
,藉此篩選索引工作。以下範例會列出專案 my_project
中五個最新的索引工作:
SELECT * FROM region-us.INFORMATION_SCHEMA.JOBS WHERE project_id = 'my_project' AND job_type IS NULL AND SEARCH(job_id, '`search_index`') ORDER BY creation_time DESC LIMIT 5;
選擇預留空間大小
如要為預留作業選擇正確的運算單元數量,請考量索引管理工作執行的時間、使用運算單元數量,以及長期的使用情形。BigQuery 會在下列情況下觸發索引管理工作:
- 您在資料表上建立索引。
- 資料是在索引資料表中修改。
- 資料表的結構定義會變更,這會影響哪些欄會建立索引。
- 系統會定期改善或更新索引資料和中繼資料。
在表格上執行索引管理工作時,所需的運算單元數量取決於下列因素:
- 表格大小
- 資料攝入至資料表的速率
- 套用至資料表的 DML 陳述式比率
- 建構及維護索引的合理延遲時間
- 索引的複雜度,通常取決於資料的屬性,例如重複字詞的數量
監控用量和進度
如要評估執行索引管理工作所需的運算單元數量,最佳做法是監控運算單元使用率,並據此調整預留空間大小。以下查詢會產生索引管理工作每日的時間段用量。區域 us-west1
只包含過去 30 天:
SELECT TIMESTAMP_TRUNC(job.creation_time, DAY) AS usage_date, -- Aggregate total_slots_ms used for index-management jobs in a day and divide -- by the number of milliseconds in a day. This value is most accurate for -- days with consistent slot usage. SAFE_DIVIDE(SUM(job.total_slot_ms), (1000 * 60 * 60 * 24)) AS average_daily_slot_usage FROM `region-us-west1`.INFORMATION_SCHEMA.JOBS job WHERE project_id = 'my_project' AND job_type IS NULL AND SEARCH(job_id, '`search_index`') GROUP BY usage_date ORDER BY usage_date DESC limit 30;
如果執行索引管理工作的時段不足,索引可能會與其表格不同步,且索引工作可能會失敗。在這種情況下,BigQuery 會從頭重新建構索引。為避免索引不同步,請確保有足夠的空缺可支援資料攝入和最佳化所需的索引更新。如要進一步瞭解如何監控時段用量,請參閱管理員資源圖表。
刪除向量索引
如果您不再需要向量索引,或想要變更資料表的索引欄,可以使用 DROP VECTOR INDEX
DDL 陳述式刪除該資料表的索引。
例如:
DROP VECTOR INDEX my_index ON my_dataset.indexed_table;
如果刪除已編入索引的資料表,系統會自動刪除其索引。
後續步驟
- 如要概略瞭解向量索引的用途、定價和限制,請參閱向量搜尋簡介。
- 瞭解如何使用
VECTOR_SEARCH
函式執行向量搜尋。 - 進一步瞭解
CREATE VECTOR INDEX
陳述式。 - 請試試使用向量搜尋搜尋嵌入教學課程。