Gestire gli indici di ricerca
Un indice di ricerca è una struttura di dati progettata per consentire una ricerca molto efficiente con la funzione SEARCH
. Un indice di ricerca
può anche ottimizzare alcune query che utilizzano
funzioni e operatori supportati.
Proprio come l'indice che trovi alla fine di un libro, un indice di ricerca per una colonna di dati stringa funge da tabella ausiliaria con una colonna per le parole uniche e un'altra per la posizione in cui si trovano queste parole nei dati.
Creare un indice di ricerca
Per creare un indice di ricerca, utilizza l'istruzione
DDL CREATE SEARCH INDEX
. Per specificare i tipi di dati primitivi da indicizzare, consulta
Creare un indice di ricerca e specificare le colonne e i tipi di dati. Se
non specifichi alcun tipo di dati, per impostazione predefinita BigQuery
indicizza le colonne dei seguenti tipi che contengono dati STRING
:
STRING
ARRAY<STRING>
STRUCT
contenente almeno un campo nidificato di tipoSTRING
oARRAY<STRING>
JSON
Quando crei un indice di ricerca, puoi specificare il tipo di
analizzatore di testo
da utilizzare. L'analizzatore di testo controlla il modo in cui i dati vengono suddivisi in token per l'indicizzazione e
la ricerca. Il valore predefinito è LOG_ANALYZER
. Questo analizzatore funziona bene per i log generati automaticamente e dispone di regole speciali per i token comunemente presenti nei dati di osservabilità, come indirizzi IP o email. Utilizza NO_OP_ANALYZER
quando hai dati pre-elaborati che vuoi abbinare esattamente.
PATTERN_ANALYZER
estrae i token dal testo utilizzando un'espressione regolare.
Creare un indice di ricerca con l'analizzatore di testo predefinito
Nell'esempio seguente, viene creato un indice di ricerca sulle colonne a
e c
di
simple_table
e viene utilizzato l'analizzatore di testo LOG_ANALYZER
per impostazione predefinita:
CREATE TABLE dataset.simple_table(a STRING, b INT64, c JSON); CREATE SEARCH INDEX my_index ON dataset.simple_table(a, c);
Crea un indice di ricerca su tutte le colonne con l'analizzatore NO_OP_ANALYZER
Quando crei un indice di ricerca su ALL COLUMNS
, vengono indicizzati tutti i dati STRING
o JSON
nella tabella. Se la tabella non contiene questi dati, ad esempio se
tutte le colonne contengono numeri interi, la creazione dell'indice non riesce. Quando specifichi una colonna STRUCT
da indicizzare, vengono indicizzati tutti i sottocampi nidificati.
Nell'esempio seguente, viene creato un indice di ricerca su a
, c.e
e c.f.g
e viene utilizzato l'analizzatore di testo NO_OP_ANALYZER
:
CREATE TABLE dataset.my_table( a STRING, b INT64, c STRUCT <d INT64, e ARRAY<STRING>, f STRUCT<g STRING, h INT64>>) AS SELECT 'hello' AS a, 10 AS b, (20, ['x', 'y'], ('z', 30)) AS c; CREATE SEARCH INDEX my_index ON dataset.my_table(ALL COLUMNS) OPTIONS (analyzer = 'NO_OP_ANALYZER');
Poiché l'indice di ricerca è stato creato il giorno ALL COLUMNS
, le colonne aggiunte alla tabella vengono indicizzate automaticamente se contengono dati STRING
.
Crea un indice di ricerca e specifica le colonne e i tipi di dati
Quando crei un indice di ricerca, puoi specificare i tipi di dati da utilizzare. I tipi di dati
controllano i tipi di colonne e sottocampi delle colonne JSON
e STRUCT
per
l'indicizzazione. Il tipo di dati predefinito per l'indicizzazione è STRING
. Per creare un indice di ricerca con più tipi di dati (ad esempio, tipi numerici), utilizza l'istruzione CREATE SEARCH INDEX
con l'opzione data_types
inclusa.
Nell'esempio seguente, viene creato un indice di ricerca sulle colonne a
, b
, c
e
d
di una tabella denominata simple_table
. I tipi di dati delle colonne supportati sono
STRING
, INT64
e TIMESTAMP
.
CREATE TABLE dataset.simple_table(a STRING, b INT64, c JSON, d TIMESTAMP); CREATE SEARCH INDEX my_index ON dataset.simple_table(a, b, c, d) OPTIONS ( data_types = ['STRING', 'INT64', 'TIMESTAMP']);
Crea un indice di ricerca su tutte le colonne e specifica i tipi di dati
Quando crei un indice di ricerca su ALL COLUMNS
con l'opzione data_types
specificata, viene indicizzata qualsiasi colonna che corrisponde a uno dei tipi di dati specificati.
Per le colonne JSON
e STRUCT
, viene indicizzato qualsiasi sottocampo nidificato che corrisponde a uno dei tipi di dati specificati.
Nell'esempio seguente, viene creato un indice di ricerca su ALL COLUMNS
con
tipi di dati specificati. Le colonne a
, b
, c
, d.e
, d.f
, d.g.h
, d.g.i
di una tabella denominata my_table
sono indicizzate:
CREATE TABLE dataset.my_table( a STRING, b INT64, c TIMESTAMP, d STRUCT <e INT64, f ARRAY<STRING>, g STRUCT<h STRING, i INT64>>) AS ( SELECT 'hello' AS a, 10 AS b, TIMESTAMP('2008-12-25 15:30:00 UTC') AS c, (20, ['x', 'y'], ('z', 30)) AS d; ) CREATE SEARCH INDEX my_index ON dataset.my_table(ALL COLUMNS) OPTIONS ( data_types = ['STRING', 'INT64', 'TIMESTAMP']);
Poiché l'indice di ricerca è stato creato il giorno ALL COLUMNS
, tutte le colonne aggiunte alla
tabella vengono indicizzate automaticamente se corrispondono a uno dei tipi di dati
specificati.
Indice con granularità della colonna
Quando crei un indice di ricerca, puoi specificare la granularità della colonna per una
colonna indicizzata. La granularità delle colonne consente a BigQuery di ottimizzare
determinati tipi di query di ricerca memorizzando informazioni aggiuntive sulle colonne
nell'indice di ricerca. Per impostare la granularità della colonna per una colonna indicizzata, utilizza l'opzione
index_granularity
in index_column_option_list
quando esegui un'istruzione
CREATE SEARCH INDEX
.
Internamente, le tabelle BigQuery sono organizzate in file. Quando crei un indice, BigQuery crea una mappatura dai token ai file che li contengono. Quando esegui una query di ricerca, BigQuery analizza tutti i file che contengono i token. Questa potrebbe essere inefficiente se il token di ricerca viene visualizzato raramente nella colonna in cui stai eseguendo la ricerca, ma è comune in un'altra colonna.
Ad esempio, supponiamo di avere la seguente tabella contenente offerte di lavoro:
CREATE TABLE my_dataset.job_postings (job_id INT64, company_name STRING, job_description STRING);
La parola competenze probabilmente compare spesso nella colonna job_description
,
ma raramente nella colonna company_name
. Supponiamo che tu esegua la seguente query:
SELECT * FROM my_dataset.job_postings WHERE SEARCH(company_name, 'skills');
Se hai creato un indice di ricerca sulle colonne company_name
e job_description
senza specificare la granularità delle colonne, BigQuery esaminerà ogni file in cui la parola skills compare nella colonna job_description
o company_name
.
Per migliorare il rendimento di questa query, puoi impostare la granularità della colonna
per company_name
su COLUMN
:
CREATE SEARCH INDEX my_index
ON my_dataset.job_postings (
company_name OPTIONS(index_granularity = 'COLUMN'),
job_description);
Ora, quando esegui la query, BigQuery analizza solo i file in cui la parola skills viene visualizzata nella colonna company_name
.
Per visualizzare informazioni sulle opzioni impostate nelle colonne di una tabella indicizzata, esegui una query sulla vista INFORMATION_SCHEMA.SEARCH_INDEX_COLUMN_OPTIONS
.
Esistono limiti al numero di colonne che puoi indicizzare con granularità della colonna. Per ulteriori informazioni, consulta Quote e limiti.
Informazioni sull'aggiornamento dell'indice
Gli indici di ricerca sono completamente gestiti da BigQuery e vengono aggiornati automaticamente quando la tabella cambia. Un aggiornamento completo dell'indice può verificarsi nei seguenti casi:
- La scadenza della partizione è aggiornata.
- Una colonna indicizzata viene aggiornata a causa di una modifica dello schema della tabella.
- L'indice non è aggiornato a causa della mancanza di slot di prenotazione
BACKGROUND
per gli aggiornamenti incrementali. Per evitare l'obsolescenza, puoi utilizzare la scalabilità automatica e monitorare il carico di lavoro per determinare la base di riferimento e la dimensione massima della prenotazione migliori.
Se i dati di una colonna indicizzata vengono aggiornati in ogni riga, ad esempio durante un'operazione di backfill, l'intero indice deve essere aggiornato, in modo equivalente a un aggiornamento completo. Ti consigliamo di eseguire i backfill lentamente, ad esempio partizione per partizione, per ridurre al minimo il potenziale impatto negativo.
Se apporti modifiche allo schema della tabella di base che impediscono l'indicizzazione di una colonna indicizzata in modo esplicito, l'indice viene disattivato definitivamente.
Se elimini l'unica colonna indicizzata in una tabella o rinomini la tabella stessa, l'indice di ricerca viene eliminato automaticamente.
Gli indici di ricerca sono progettati per tabelle di grandi dimensioni. Se crei un indice di ricerca su una tabella più piccola di 10 GB, l'indice non viene compilato. Allo stesso modo,
se elimini dati da una tabella indicizzata e le dimensioni della tabella scendono al di sotto di 10 GB,
l'indice viene temporaneamente disattivato. In questo caso, le query di ricerca non
utilizzano l'indice e il
codice IndexUnusedReason
è BASE_TABLE_TOO_SMALL
. Ciò accade indipendentemente dal fatto che tu utilizzi o meno la tua prenotazione per i job di gestione degli indici. Quando le dimensioni di una tabella indicizzata superano
10 GB, l'indice viene compilato automaticamente. Non ti viene addebitato alcun costo per l'archiviazione
finché l'indice di ricerca non viene compilato e attivato. Le query che utilizzano la SEARCH
funzione
restituiscono sempre risultati corretti anche se alcuni dati non sono ancora indicizzati.
Ricevere informazioni sugli indici di ricerca
Puoi verificare l'esistenza e la disponibilità di un indice di ricerca eseguendo una query
INFORMATION_SCHEMA
. Esistono tre visualizzazioni che contengono metadati sugli indici di ricerca.
- La visualizzazione
INFORMATION_SCHEMA.SEARCH_INDEXES
contiene informazioni su ogni indice di ricerca creato in un set di dati. - La visualizzazione
INFORMATION_SCHEMA.SEARCH_INDEX_COLUMNS
contiene informazioni sulle colonne di ogni tabella del set di dati che sono indicizzate. - La
INFORMATION_SCHEMA.SEARCH_INDEXES_BY_ORGANIZATION
vista contiene informazioni sugli indici di ricerca per l'intera organizzazione associata al progetto corrente.
INFORMATION_SCHEMA.SEARCH_INDEXES
visualizza esempi
Questa sezione include query di esempio della visualizzazione INFORMATION_SCHEMA.SEARCH_INDEXES
.
L'esempio seguente mostra tutti gli indici di ricerca attivi nelle tabelle del set di dati
my_dataset
, che si trova nel progetto my_project
. Include i loro nomi, le
istruzioni DDL utilizzate per crearli, la percentuale di copertura e l'analizzatore
di testo. Se una tabella di base indicizzata è
inferiore a 10 GB, il relativo indice non viene compilato, nel qual caso
coverage_percentage
è 0.
SELECT table_name, index_name, ddl, coverage_percentage, analyzer
FROM my_project.my_dataset.INFORMATION_SCHEMA.SEARCH_INDEXES
WHERE index_status = 'ACTIVE';
I risultati dovrebbero essere simili ai seguenti:
+-------------+-------------+--------------------------------------------------------------------------------------+---------------------+----------------+ | table_name | index_name | ddl | coverage_percentage | analyzer | +-------------+-------------+--------------------------------------------------------------------------------------+---------------------+----------------+ | small_table | names_index | CREATE SEARCH INDEX `names_index` ON `my_project.my_dataset.small_table`(names) | 0 | NO_OP_ANALYZER | | large_table | logs_index | CREATE SEARCH INDEX `logs_index` ON `my_project.my_dataset.large_table`(ALL COLUMNS) | 100 | LOG_ANALYZER | +-------------+-------------+--------------------------------------------------------------------------------------+---------------------+----------------+
INFORMATION_SCHEMA.SEARCH_INDEX_COLUMNS
visualizza esempi
Questa sezione include query di esempio della visualizzazione INFORMATION_SCHEMA.SEARCH_INDEX_COLUMNS
.
L'esempio seguente crea un indice di ricerca su tutte le colonne di my_table
.
CREATE TABLE dataset.my_table( a STRING, b INT64, c STRUCT <d INT64, e ARRAY<STRING>, f STRUCT<g STRING, h INT64>>) AS SELECT 'hello' AS a, 10 AS b, (20, ['x', 'y'], ('z', 30)) AS c; CREATE SEARCH INDEX my_index ON dataset.my_table(ALL COLUMNS);
La seguente query estrae informazioni sui campi indicizzati.
Il index_field_path
indica quale campo di una colonna è
indicizzato. Questo valore differisce da index_column_name
solo nel caso di un
STRUCT
, in cui viene fornito il percorso completo al campo indicizzato. In questo esempio,
la colonna c
contiene un campo ARRAY<STRING>
e
e un altro campo STRUCT
chiamato
f
che contiene un campo STRING
g
, ognuno dei quali è indicizzato.
SELECT table_name, index_name, index_column_name, index_field_path
FROM my_project.dataset.INFORMATION_SCHEMA.SEARCH_INDEX_COLUMNS
Il risultato è simile al seguente:
+------------+------------+-------------------+------------------+ | table_name | index_name | index_column_name | index_field_path | +------------+------------+-------------------+------------------+ | my_table | my_index | a | a | | my_table | my_index | c | c.e | | my_table | my_index | c | c.f.g | +------------+------------+-------------------+------------------+
La seguente query unisce la vista INFORMATION_SCHEMA.SEARCH_INDEX_COUMNS
con
le viste INFORMATION_SCHEMA.SEARCH_INDEXES
e INFORMATION_SCHEMA.COLUMNS
per includere lo stato dell'indice di ricerca e il tipo di dati di ogni colonna:
SELECT index_columns_view.index_catalog AS project_name, index_columns_view.index_SCHEMA AS dataset_name, indexes_view.TABLE_NAME AS table_name, indexes_view.INDEX_NAME AS index_name, indexes_view.INDEX_STATUS AS status, index_columns_view.INDEX_COLUMN_NAME AS column_name, index_columns_view.INDEX_FIELD_PATH AS field_path, columns_view.DATA_TYPE AS data_type FROM mydataset.INFORMATION_SCHEMA.SEARCH_INDEXES indexes_view INNER JOIN mydataset.INFORMATION_SCHEMA.SEARCH_INDEX_COLUMNS index_columns_view ON indexes_view.TABLE_NAME = index_columns_view.TABLE_NAME AND indexes_view.INDEX_NAME = index_columns_view.INDEX_NAME LEFT OUTER JOIN mydataset.INFORMATION_SCHEMA.COLUMNS columns_view ON indexes_view.INDEX_CATALOG = columns_view.TABLE_CATALOG AND indexes_view.INDEX_SCHEMA = columns_view.TABLE_SCHEMA AND index_columns_view.TABLE_NAME = columns_view.TABLE_NAME AND index_columns_view.INDEX_COLUMN_NAME = columns_view.COLUMN_NAME ORDER BY project_name, dataset_name, table_name, column_name;
Il risultato è simile al seguente:
+------------+------------+----------+------------+--------+-------------+------------+---------------------------------------------------------------+ | project | dataset | table | index_name | status | column_name | field_path | data_type | +------------+------------+----------+------------+--------+-------------+------------+---------------------------------------------------------------+ | my_project | my_dataset | my_table | my_index | ACTIVE | a | a | STRING | | my_project | my_dataset | my_table | my_index | ACTIVE | c | c.e | STRUCT<d INT64, e ARRAY<STRING>, f STRUCT<g STRING, h INT64>> | | my_project | my_dataset | my_table | my_index | ACTIVE | c | c.f.g | STRUCT<d INT64, e ARRAY<STRING>, f STRUCT<g STRING, h INT64>> | +------------+------------+----------+------------+--------+-------------+------------+---------------------------------------------------------------+
INFORMATION_SCHEMA.SEARCH_INDEXES_BY_ORGANIZATION
visualizza esempi
Questa sezione include query di esempio della visualizzazione INFORMATION_SCHEMA.SEARCH_INDEXES_BY_ORGANIZATION
.
Verificare se il consumo supera il limite in una determinata regione
Il seguente esempio illustra se la dimensione totale della tabella di base indicizzata in un'organizzazione, che utilizza slot condivisi all'interno della multiregione degli Stati Uniti, supera i 100 TB:
WITH indexed_base_table_size AS ( SELECT SUM(base_table.total_logical_bytes) AS total_logical_bytes FROM `region-us`.INFORMATION_SCHEMA.SEARCH_INDEXES_BY_ORGANIZATION AS search_index JOIN `region-us`.INFORMATION_SCHEMA.TABLE_STORAGE_BY_ORGANIZATION AS base_table ON (search_index.table_name = base_table.table_name AND search_index.project_id = base_table.project_id AND search_index.index_schema = base_table.table_schema) WHERE TRUE -- Excludes search indexes that are permanently disabled. AND search_index.index_status != 'PERMANENTLY DISABLED' -- Excludes BASE_TABLE_TOO_SMALL search indexes whose base table size is -- less than 10 GB. These tables don't count toward the limit. AND search_index.index_status_details.throttle_status != 'BASE_TABLE_TOO_SMALL' -- Excludes search indexes whose project has BACKGROUND reservation purchased -- for search indexes. AND search_index.use_background_reservation = false -- Outputs the total indexed base table size if it exceeds 100 TB, -- otherwise, doesn't return any output. ) SELECT * FROM indexed_base_table_size WHERE total_logical_bytes >= 109951162777600 -- 100 TB
Il risultato è simile al seguente:
+---------------------+ | total_logical_bytes | +---------------------+ | 109951162777601 | +---------------------+
Trovare le dimensioni totali della tabella di base indicizzata per progetti in una regione
L'esempio seguente mostra la suddivisione di ogni progetto in una regione multiregionale degli Stati Uniti con la dimensione totale delle tabelle di base indicizzate:
SELECT search_index.project_id, search_index.use_background_reservation, SUM(base_table.total_logical_bytes) AS total_logical_bytes FROM `region-us`.INFORMATION_SCHEMA.SEARCH_INDEXES_BY_ORGANIZATION AS search_index JOIN `region-us`.INFORMATION_SCHEMA.TABLE_STORAGE_BY_ORGANIZATION AS base_table ON (search_index.table_name = base_table.table_name AND search_index.project_id = base_table.project_id AND search_index.index_schema = base_table.table_schema) WHERE TRUE -- Excludes search indexes that are permanently disabled. AND search_index.index_status != 'PERMANENTLY DISABLED' -- Excludes BASE_TABLE_TOO_SMALL search indexes whose base table size is -- less than 10 GB. These tables don't count toward limit. AND search_index.index_status_details.throttle_status != 'BASE_TABLE_TOO_SMALL' GROUP BY search_index.project_id, search_index.use_background_reservation
Il risultato è simile al seguente:
+---------------------+----------------------------+---------------------+ | project_id | use_background_reservation | total_logical_bytes | +---------------------+----------------------------+---------------------+ | projecta | true | 971329178274633 | +---------------------+----------------------------+---------------------+ | projectb | false | 834638211024843 | +---------------------+----------------------------+---------------------+ | projectc | false | 562910385625126 | +---------------------+----------------------------+---------------------+
Trovare gli indici di ricerca limitati
L'esempio seguente restituisce tutti gli indici di ricerca limitati all'interno dell'organizzazione e della regione:
SELECT project_id, index_schema, table_name, index_name FROM `region-us`.INFORMATION_SCHEMA.SEARCH_INDEXES_BY_ORGANIZATION WHERE -- Excludes search indexes that are permanently disabled. index_status != 'PERMANENTLY DISABLED' AND index_status_details.throttle_status IN ('ORGANIZATION_LIMIT_EXCEEDED', 'BASE_TABLE_TOO_LARGE')
Il risultato è simile al seguente:
+--------------------+--------------------+---------------+----------------+ | project_id | index_schema | table_name | index_name | +--------------------+--------------------+---------------+----------------+ | projecta | dataset_us | table1 | index1 | | projectb | dataset_us | table1 | index1 | +--------------------+--------------------+---------------+----------------+
Opzioni di gestione degli indici
Per creare indici e farli gestire da BigQuery, hai due opzioni:
- Utilizza il pool di slot condiviso predefinito: quando i dati che prevedi di indicizzare sono inferiori al limite per organizzazione, puoi utilizzare il pool di slot condiviso gratuito per la gestione degli indici.
- Utilizza la tua prenotazione: Per ottenere un avanzamento dell'indicizzazione più prevedibile e coerente nei carichi di lavoro di produzione più grandi, puoi utilizzare le tue prenotazioni per la gestione dell'indice.
Utilizzare slot condivisi
Se non hai configurato il tuo progetto per utilizzare una prenotazione dedicata per l'indicizzazione, la gestione dell'indice viene gestita nel pool di slot condiviso gratuito, soggetto ai seguenti vincoli.
Se aggiungi dati a una tabella che causa il superamento del limite della tua organizzazione per le tabelle indicizzate, BigQuery mette in pausa la gestione degli indici per tutte le tabelle indicizzate. In questo caso, il campo index_status
nella
visualizzazione INFORMATION_SCHEMA.SEARCH_INDEXES
mostra PENDING DISABLEMENT
e l'indice viene messo in coda per l'eliminazione. Mentre
l'indice è in attesa di disattivazione, viene
ancora utilizzato nelle query e ti viene addebitato lo spazio di archiviazione dell'indice.
Dopo l'eliminazione di un indice, il campo index_status
mostra
l'indice come TEMPORARILY DISABLED
. In questo stato, le query non utilizzano l'indice
e non ti viene addebitato alcun costo per l'archiviazione dell'indice. In questo caso, il
codice IndexUnusedReason
è BASE_TABLE_TOO_LARGE
.
Se elimini i dati dalla tabella e le dimensioni totali delle tabelle indicizzate
scendono al di sotto del limite per organizzazione, la gestione degli indici viene ripresa per
tutte le tabelle indicizzate. Il campo index_status
nella
vista INFORMATION_SCHEMA.SEARCH_INDEXES
è ACTIVE
, le query possono utilizzare l'indice e ti viene addebitato lo spazio di archiviazione dell'indice.
Puoi utilizzare la visualizzazione INFORMATION_SCHEMA.SEARCH_INDEXES_BY_ORGANIZATION
per comprendere il tuo consumo attuale rispetto al limite per organizzazione in una determinata regione, suddiviso per progetti e tabelle.
BigQuery non offre garanzie sulla capacità disponibile del pool condiviso o sulla velocità effettiva di indicizzazione visualizzata. Per le applicazioni di produzione, ti consigliamo di utilizzare slot dedicati per l'elaborazione degli indici.
Utilizzare una prenotazione personale
Anziché utilizzare il pool di slot condiviso predefinito, puoi facoltativamente designare una tua prenotazione per indicizzare le tabelle. L'utilizzo della tua prenotazione garantisce un rendimento prevedibile e coerente dei job di gestione degli indici, come la creazione, l'aggiornamento e le ottimizzazioni in background.
- Non sono previsti limiti di dimensioni delle tabelle quando un job di indicizzazione viene eseguito nella tua prenotazione.
- L'utilizzo della tua prenotazione ti offre flessibilità nella gestione dell'indice. Se devi creare un indice molto grande o apportare un aggiornamento importante a una tabella indicizzata, puoi aggiungere temporaneamente altri slot all'assegnazione.
Per indicizzare le tabelle in un progetto con una prenotazione designata,
crea una prenotazione
nella regione in cui si trovano le tabelle. Poi, assegna il progetto alla
prenotazione con job_type
impostato su BACKGROUND
:
SQL
Utilizza l'istruzione DDL CREATE ASSIGNMENT
.
Nella console Google Cloud , vai alla pagina BigQuery.
Nell'editor di query, inserisci la seguente istruzione:
CREATE ASSIGNMENT `ADMIN_PROJECT_ID.region-LOCATION.RESERVATION_NAME.ASSIGNMENT_ID` OPTIONS ( assignee = 'projects/PROJECT_ID', job_type = 'BACKGROUND');
Sostituisci quanto segue:
ADMIN_PROJECT_ID
: l'ID progetto del progetto di amministrazione proprietario della risorsa di prenotazioneLOCATION
: la posizione della prenotazioneRESERVATION_NAME
: il nome della prenotazioneASSIGNMENT_ID
: l'ID dell'assegnazioneL'ID deve essere univoco per il progetto e la località, iniziare e terminare con una lettera minuscola o un numero e contenere solo lettere minuscole, numeri e trattini.
PROJECT_ID
: l'ID del progetto contenente le tabelle da indicizzare. Questo progetto è assegnato alla prenotazione.
Fai clic su
Esegui.
Per maggiori informazioni su come eseguire le query, consulta Eseguire una query interattiva.
bq
Utilizza il comando 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
Sostituisci quanto segue:
ADMIN_PROJECT_ID
: l'ID progetto del progetto di amministrazione che possiede la risorsa di prenotazioneLOCATION
: la posizione della prenotazioneRESERVATION_NAME
: il nome della prenotazionePROJECT_ID
: l'ID del progetto da assegnare a questa prenotazione
Visualizzare i job di indicizzazione
Ogni volta che viene creato o aggiornato un indice in una singola tabella, viene creato un nuovo job di indicizzazione. Per visualizzare informazioni sul job, esegui una query sulle
viste INFORMATION_SCHEMA.JOBS*
. Puoi
filtrare i job di indicizzazione
impostando job_type IS NULL AND SEARCH(job_id, '`search_index`')
nella clausola
WHERE
della query. L'esempio seguente elenca i cinque job di indicizzazione più recenti nel progetto 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;
Scegli le dimensioni della prenotazione
Per scegliere il numero corretto di slot per la prenotazione, devi considerare quando vengono eseguiti i job di gestione degli indici, quanti slot utilizzano e come appare il tuo utilizzo nel tempo. BigQuery attiva un job di gestione degli indici nelle seguenti situazioni:
- Crei un indice in una tabella.
- I dati vengono modificati in una tabella indicizzata.
- Lo schema di una tabella cambia e ciò influisce sulle colonne indicizzate.
- I dati e i metadati dell'indice vengono periodicamente ottimizzati o aggiornati.
Il numero di slot necessari per un job di gestione degli indici su una tabella dipende dai seguenti fattori:
- Le dimensioni della tabella
- Il tasso di importazione dati nella tabella
- Il tasso di istruzioni DML applicate alla tabella
- Il ritardo accettabile per la creazione e la manutenzione dell'indice
- La complessità dell'indice, in genere determinata dagli attributi dei dati, ad esempio il numero di termini duplicati
Stima iniziale
Le seguenti stime possono aiutarti ad approssimare il numero di slot richiesti dalla tua prenotazione. A causa della natura altamente variabile dei carichi di lavoro di indicizzazione, devi rivalutare i requisiti dopo aver iniziato a indicizzare i dati.
- Dati esistenti: con una prenotazione di 1000 slot, una tabella esistente in BigQuery può essere indicizzata a una velocità media massima di 4 GiB al secondo, ovvero circa 336 TiB al giorno.
- Dati appena importati: l'indicizzazione è in genere più dispendiosa in termini di risorse per i dati appena importati, poiché la tabella e il relativo indice vengono sottoposti a diversi cicli di ottimizzazioni trasformative. In media, l'indicizzazione dei dati appena inseriti consuma tre volte le risorse rispetto all'indicizzazione iniziale di backfill degli stessi dati.
- Dati modificati di rado: le tabelle indicizzate con modifiche ai dati minime o nulle richiedono molte meno risorse per la manutenzione continua dell'indice. Un punto di partenza consigliato è mantenere 1/5 degli slot necessari per l'indicizzazione di backfill iniziale degli stessi dati e non meno di 250 slot.
- L'avanzamento dell'indicizzazione aumenta in modo approssimativamente lineare in base alle dimensioni della prenotazione. Tuttavia, non consigliamo di utilizzare prenotazioni inferiori a 250 slot per l'indicizzazione perché potrebbero verificarsi inefficienze che possono rallentare l'avanzamento dell'indicizzazione.
- Queste stime possono variare in base alle funzionalità, alle ottimizzazioni e all'utilizzo effettivo.
- Se le dimensioni totali della tabella della tua organizzazione superano il limite di indicizzazione della tua regione, devi mantenere una prenotazione diversa da zero assegnata per l'indicizzazione. In caso contrario, l'indicizzazione potrebbe tornare al livello predefinito, con conseguente eliminazione involontaria di tutti gli indici.
Monitorare l'utilizzo e i progressi
Il modo migliore per valutare il numero di slot necessari per eseguire in modo efficiente i
job di gestione degli indici è monitorare l'utilizzo degli slot e modificare le
dimensioni della prenotazione di conseguenza. La seguente query produce l'utilizzo giornaliero degli slot
per i job di gestione degli indici. Solo gli ultimi 30 giorni sono inclusi nella
regione us-west1
:
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;
Quando non ci sono slot sufficienti per eseguire i job di gestione degli indici, un indice può diventare non sincronizzato con la tabella e i job di indicizzazione potrebbero non riuscire. In questo caso, BigQuery ricompila l'indice da zero. Per evitare di avere un indice non sincronizzato, assicurati di disporre di slot sufficienti per supportare gli aggiornamenti dell'indice dall'importazione e dall'ottimizzazione dei dati. Per ulteriori informazioni sul monitoraggio dell'utilizzo degli slot, consulta grafici delle risorse amministrative.
Best practice
- Gli indici di ricerca sono progettati per tabelle di grandi dimensioni. I miglioramenti delle prestazioni di un indice di ricerca aumentano con le dimensioni della tabella.
- Non indicizzare le colonne che contengono solo un numero molto ridotto di valori univoci.
- Non indicizzare le colonne che non intendi utilizzare con la funzione
SEARCH
o con qualsiasi altra funzione e operatore supportati. - Fai attenzione quando crei un indice di ricerca su
ALL COLUMNS
. Ogni volta che aggiungi una colonna contenente datiSTRING
oJSON
, viene indicizzata. - Devi utilizzare la tua prenotazione per la gestione degli indici nelle applicazioni di produzione. Se scegli di utilizzare il pool di slot condiviso predefinito per i job di gestione degli indici, si applicano i limiti di dimensionamento per organizzazione.
Eliminare un indice di ricerca
Quando non hai più bisogno di un indice di ricerca o vuoi modificare le colonne
indicizzate in una tabella, puoi eliminare l'indice attualmente presente nella tabella. Utilizza l'istruzione DDL DROP SEARCH INDEX
.
Se una tabella indicizzata viene eliminata, il relativo indice viene eliminato automaticamente.
Esempio:
DROP SEARCH INDEX my_index ON dataset.simple_table;
Passaggi successivi
- Per una panoramica dei casi d'uso, dei prezzi, delle autorizzazioni richieste e delle limitazioni dell'indice di ricerca, consulta la Introduzione alla ricerca in BigQuery.
- Per informazioni sulla ricerca efficiente di colonne indicizzate, vedi Ricerca con un indice.