Query tra più cluster e tra più database
Si applica a: ✅Microsoft Fabric✅Azure Esplora dati✅ Azure Monitor✅Microsoft Sentinel
Le query vengono eseguite con un database specifico designato come database nel contesto. Questo database funge da impostazione predefinita per il controllo delle autorizzazioni. Se viene fatto riferimento a un'entità in una query senza specificare il cluster o il database, viene risolto in questo database.
Le query vengono eseguite con un database specifico designato come database nel contesto. Questo database funge da impostazione predefinita per il controllo delle autorizzazioni. Se viene fatto riferimento a un'entità in una query senza specificare il contesto, viene risolto in questo database.
Questo articolo illustra come eseguire query che coinvolgono entità che si trovano all'esterno del database di contesto corrente.
Prerequisiti
- Se i cluster si trovano in tenant diversi, seguire le istruzioni riportate in Consenti query e comandi tra tenant.
Identificare il cluster e il database nel contesto
Identificare la eventhouse e il database nel contesto
Nella tabella seguente viene illustrato come identificare il database nel contesto in base all'ambiente di query.
Ambiente | Database nel contesto |
---|---|
Kusto Explorer | Il database predefinito è quello selezionato nel pannello connessioni e il cluster corrente è il cluster contenente tale database. |
Interfaccia utente Web di Azure Esplora dati | Il database predefinito è quello selezionato nel riquadro di connessione e il cluster corrente è il cluster contenente tale database. |
Librerie client | Specificare il database e il cluster predefiniti in base alle Data Source proprietà e Initial Catalog dei stringa di connessione Kusto. |
Ambiente | Database/Eventhouse nel contesto |
---|---|
Kusto Explorer | Il database predefinito è quello selezionato nel pannello connessioni e la eventhouse corrente è la eventhouse contenente tale database. |
Queryset KQL di Intelligence in tempo reale | Il database predefinito è il database corrente selezionato direttamente o tramite una eventhouse. |
Librerie client | Specificare il database predefinito con l'URI del database, usato per le Data Source proprietà dei stringa di connessione Kusto. Per la eventhouse, usare il relativo URI del cluster. Per trovarla, selezionare Panoramica del sistema nella sezione Dettagli dell'evento per la casa eventi selezionata. |
Eseguire query tra cluster o tra database
Eseguire query tra più eventi o tra database
Per accedere alle entità esterne al database nel contesto, usare le funzioni cluster() e database() per qualificare il nome dell'entità.
Per una tabella in un database diverso all'interno dello stesso cluster:
database("<DatabaseName>").<TableName>
Per una tabella in un cluster remoto:
cluster("<ClusterName>").database("<DatabaseName>").<TableName>
Per una tabella in un database diverso all'interno della stessa eventhouse:
database("<DatabaseName>").<TableName>
Per una tabella in una eventhouse remota o in un cluster remoto (ad esempio azure Esplora dati):
cluster("<EventhouseClusterURI>").database("<DatabaseName>").<TableName>
Nota
Per eseguire una query, è necessario disporre dell'autorizzazione visualizzatore per il database predefinito e per tutti gli altri database a cui viene fatto riferimento nella query. Per altre informazioni, vedere Controllo degli accessi in base al ruolo di Kusto.
Suggerimento
Il numero di record restituiti da una query è limitato per impostazione predefinita, anche se non esiste un uso specifico dell'operatore take
. Per aumentare questo limite, usare l'opzione di richiesta client notruncation
. Per altre informazioni, vedere Limiti delle query.
Nomi qualificati e operatore union
Quando un nome completo viene visualizzato come operando dell'operatore union, è possibile usare i caratteri jolly per specificare più tabelle e più database. I caratteri jolly non sono consentiti nei nomi dei cluster.
union withsource=TableName *, database("OtherDb*").*Table, cluster("OtherCluster").database("*").*
Quando un nome completo viene visualizzato come operando dell'operatore union, è possibile usare i caratteri jolly per specificare più tabelle e più database. I caratteri jolly non sono consentiti nei nomi delle case eventi.
union withsource=TableName *, database("OtherDb*").*Table, cluster("OtherEventhouseClusterURI").database("*").*
Nota
Il nome del database predefinito è anche una potenziale corrispondenza, quindi database("*")
specifica tutte le tabelle di tutti i database, incluso il valore predefinito.
Nomi qualificati e istruzioni di accesso limitati
I nomi o i modelli qualificati possono essere inclusi anche nell'istruzione limita l'accesso . I caratteri jolly nei nomi dei cluster non sono consentiti.
I caratteri jolly nei nomi delle case eventi non sono consentiti.
La query seguente limita l'accesso alle query alle entità seguenti:
- Qualsiasi nome di entità a partire da my... nel database predefinito.
- Qualsiasi tabella in tutti i database denominati MyOther... del cluster corrente.
- Qualsiasi tabella in tutti i database denominati my2... nel cluster OtherCluster.kusto.windows.net.
restrict access to (my*, database("MyOther*").*, cluster("OtherCluster").database("my2*").*);
- Qualsiasi nome di entità che inizia con l'evento ... nel database predefinito.
- Qualsiasi tabella in tutti i database denominati EventOther... della eventhouse corrente.
- Qualsiasi tabella in tutti i database denominati event2... nella OtherEventhouse.kusto.data.microsoft.com dell'evento.
restrict access to (event*, database("EventOther*").*, cluster("OtherEventhouseClusterURI").database("event2*").*);
Gestire le modifiche dello schema delle entità remote
Per elaborare una query tra cluster, il cluster che esegue l'interpretazione iniziale delle query deve avere lo schema delle entità a cui si fa riferimento nei cluster remoti. Per ottenere queste informazioni, viene inviato un comando per recuperare gli schemi, che vengono quindi archiviati in una cache.
Se si verifica una modifica dello schema nel cluster remoto, uno schema memorizzato nella cache potrebbe diventare obsoleto. Ciò può causare effetti indesiderati, inclusi gli scenari in cui le colonne nuove o eliminate causano un oggetto Partial query failure
. Per risolvere questi problemi, aggiornare manualmente lo schema con il comando .clear cache remote-schema .
Per elaborare una query tra case eventi o cluster da eventhouse ad ADX, l'eventhouse che esegue l'interpretazione iniziale della query deve avere lo schema delle entità a cui si fa riferimento su case eventi o cluster remoti. Per ottenere queste informazioni, viene inviato un comando per recuperare gli schemi, che vengono quindi archiviati in una cache.
Se si verifica una modifica dello schema remoto, uno schema memorizzato nella cache potrebbe diventare obsoleto. Ciò può causare effetti indesiderati, inclusi gli scenari in cui le colonne nuove o eliminate causano un oggetto Partial query failure
. Per risolvere questi problemi, aggiornare manualmente lo schema con il comando .clear cache remote-schema .
Funzioni e viste
Le funzioni e le viste (persistenti e create inline) possono fare riferimento a tabelle attraverso i limiti del database e del cluster. Il codice seguente è valido.
let MyView = Table1 join database("OtherDb").Table2 on Key | join cluster("OtherCluster").database("SomeDb").Table3 on Key;
MyView | where ...
È possibile accedere a funzioni e viste persistenti da un altro database nello stesso cluster.
Si supponga, ad esempio, di creare la funzione tabulare seguente (vista) in un database OtherDb
:
.create function MyView(v:string) { Table1 | where Column1 has v ... }
Creare quindi la funzione scalare seguente in un database OtherDb
:
.create function MyCalc(a:double, b:double, c:double) { (a + b) / c }
Nel database predefinito è possibile fare riferimento a queste entità come indicato di seguito:
database("OtherDb").MyView("exception") | extend CalCol=database("OtherDb").MyCalc(Col1, Col2, Col3) | take 10
Funzioni e viste (persistenti e create inline) possono fare riferimento a tabelle attraverso i limiti del database e della casa eventi. Il codice seguente è valido.
let EventView = Table1 join database("OtherDb").Table2 on Key | join cluster("OtherEventhouseClusterURI").database("SomeDb").Table3 on Key;
EventView | where ...
È possibile accedere a funzioni e viste persistenti da un altro database nella stessa eventhouse.
Si supponga, ad esempio, di creare la funzione tabulare seguente (vista) in un database OtherDb
:
.create function EventView(v:string) { Table1 | where Column1 has v ... }
Creare quindi la funzione scalare seguente in un database OtherDb
:
.create function EventCalc(a:double, b:double, c:double) { (a + b) / c }
Si supponga, ad esempio, di creare la funzione tabulare seguente (vista) in un database OtherDb
:
.create function EventView(v:string) { Table1 | where Column1 has v ... }
Creare quindi la funzione scalare seguente in un database OtherDb
:
.create function EventCalc(a:double, b:double, c:double) { (a + b) / c }
Nel database predefinito è possibile fare riferimento a queste entità come indicato di seguito:
database("OtherDb").EventView("exception") | extend CalCol=database("OtherDb").EventCalc(Col1, Col2, Col3) | take 10
Limitazioni delle chiamate di funzione tra cluster
È possibile fare riferimento a funzioni o viste tabulari tra cluster. Si applicano le limitazioni seguenti:
- Le funzioni remote devono restituire uno schema tabulare. È possibile accedere alle funzioni scalari solo nello stesso cluster.
- Le funzioni remote possono accettare solo argomenti scalari. Le funzioni che ottengono uno o più argomenti di tabella possono essere accessibili solo nello stesso cluster.
- Lo schema dei risultati delle funzioni remote deve essere corretto (noto in anticipo senza eseguire parti della query). I costrutti di query, ad esempio il
pivot
plug-in, non possono quindi essere usati. Alcuni plug-in, ad esempio ilbag_unpack
plug-in, supportano un modo per indicare lo schema dei risultati in modo statico e in questo formato può essere usato nelle chiamate di funzione tra cluster. - Per motivi di prestazioni, il cluster chiamante memorizza nella cache lo schema delle entità remote dopo la chiamata iniziale. Di conseguenza, le modifiche apportate all'entità remota potrebbero causare una mancata corrispondenza con le informazioni sullo schema memorizzate nella cache, causando potenzialmente errori di query. Per altre informazioni, vedere Query tra cluster e modifiche dello schema.
Limitazioni delle chiamate di funzione cross-eventhouse
È possibile fare riferimento a funzioni o viste tabulari tra le case eventi. Si applicano le limitazioni seguenti:
- Le funzioni remote devono restituire uno schema tabulare. È possibile accedere alle funzioni scalari solo nella stessa eventhouse.
- Le funzioni remote possono accettare solo argomenti scalari. Le funzioni che ottengono uno o più argomenti di tabella possono essere accessibili solo nella stessa eventhouse.
- Lo schema dei risultati delle funzioni remote deve essere corretto (noto in anticipo senza eseguire parti della query). I costrutti di query, ad esempio il
pivot
plug-in, non possono quindi essere usati. Alcuni plug-in, ad esempio ilbag_unpack
plug-in, supportano un modo per indicare lo schema dei risultati in modo statico e in questo formato può essere usato nelle chiamate di funzione cross-eventhouse. - Per motivi di prestazioni, la eventhouse chiamante memorizza nella cache lo schema delle entità remote dopo la chiamata iniziale. Di conseguenza, le modifiche apportate all'entità remota potrebbero causare una mancata corrispondenza con le informazioni sullo schema memorizzate nella cache, causando potenzialmente errori di query. Per altre informazioni, vedere Query tra cluster e modifiche dello schema.
Esempi
La chiamata tra cluster seguente è valida.
cluster("OtherCluster").database("SomeDb").MyView("exception") | count
La query seguente chiama una funzione MyCalc
scalare remota.
Questa chiamata viola la regola 1, quindi non è valida.
MyTable | extend CalCol=cluster("OtherCluster").database("OtherDb").MyCalc(Col1, Col2, Col3) | take 10
La query seguente chiama la funzione MyCalc
remota e fornisce un parametro tabulare.
Questa chiamata viola la regola n. 2, quindi non è valida.
cluster("OtherCluster").database("OtherDb").MyCalc(datatable(x:string, y:string)["x","y"] )
La chiamata cross-eventhouse seguente è valida.
cluster("OtherEventhouseURI").database("SomeDb").EventView("exception") | count
La query seguente chiama una funzione EventCalc
scalare remota.
Questa chiamata viola la regola 1, quindi non è valida.
Eventtable | extend CalCol=cluster("OtherEventhouseClusterURI").database("OtherDb").MyCalc(Col1, Col2, Col3) | take 10
La query seguente chiama la funzione EventCalc
remota e fornisce un parametro tabulare.
Questa chiamata viola la regola n. 2, quindi non è valida.
cluster("EventhouseClusterURI").database("OtherDb").MyCalc(datatable(x:string, y:string)["x","y"] )
La query seguente chiama la funzione SomeTable
remota con un output dello schema variabile basato sul parametro tablename
.
Questa chiamata viola la regola 3, quindi non è valida.
Funzione tabulare in OtherDb
.
.create function SomeTable(tablename:string) { table(tablename) }
Nel database predefinito.
cluster("OtherCluster").database("OtherDb").SomeTable("MyTable")
cluster("OtherEventhouseClusterURI").database("OtherDb").SomeTable("EventTable")
La query seguente chiama la funzione GetDataPivot
remota con un output dello schema variabile basato sui dati (plug-in pivot() con output dinamico.
Questa chiamata viola la regola 3, quindi non è valida.
Funzione tabulare in OtherDb
.
.create function GetDataPivot() { T | evaluate pivot(PivotColumn) }
Funzione tabulare nel database predefinito.
cluster("OtherCluster").database("OtherDb").GetDataPivot()
cluster("OtherEventhouseClusterURI").database("OtherDb").GetDataPivot()