Esecuzione di query su più partizioniMulti-shard querying

PanoramicaOverview

Con gli strumenti dei database elastici è possibile creare soluzioni di database partizionati.With the Elastic Database tools, you can create sharded database solutions. La funzionalità di query su più partizioni viene usata per attività che richiedono l'esecuzione di una query su più partizioni, ad esempio la raccolta o la creazione di report sui dati,Multi-shard querying is used for tasks such as data collection/reporting that require running a query that stretches across several shards. a differenza del routing dipendente dai dati, che consente di eseguire tutto il lavoro su una singola partizione.(Contrast this to data-dependent routing, which performs all work on a single shard.)

  1. Ottenere una mappa RangeShardMap o ListShardMap con il metodo TryGetRangeShardMap, TryGetListShardMap o GetShardMap.Get a RangeShardMap or ListShardMap using the TryGetRangeShardMap, the TryGetListShardMap, or the GetShardMap method. Vedere Creazione di un oggetto ShardMapManager e Ottenere una mappa RangeShardMap o ListShardMap.See Constructing a ShardMapManager and Get a RangeShardMap or ListShardMap.
  2. Creare un oggetto MultiShardConnection.Create a MultiShardConnection object.
  3. Creare un MultiShardCommand.Create a MultiShardCommand.
  4. Impostare la proprietà CommandText su un comando T-SQL.Set the CommandText property to a T-SQL command.
  5. Eseguire il comando chiamando il metodo ExecuteReader.Execute the command by calling the ExecuteReader method.
  6. Vedere i risultati usando la classe MultiShardDataReader.View the results using the MultiShardDataReader class.

EsempioExample

Il codice seguente illustra l'uso delle query su più partizioni mediante uno specifico oggetto ShardMap denominato myShardMap.The following code illustrates the usage of multi-shard querying using a given ShardMap named myShardMap.

using (MultiShardConnection conn = new MultiShardConnection( 
                                    myShardMap.GetShards(), 
                                    myShardConnectionString) 
      ) 
{ 
using (MultiShardCommand cmd = conn.CreateCommand())
       { 
        cmd.CommandText = "SELECT c1, c2, c3 FROM ShardedTable"; 
        cmd.CommandType = CommandType.Text; 
        cmd.ExecutionOptions = MultiShardExecutionOptions.IncludeShardNameColumn; 
        cmd.ExecutionPolicy = MultiShardExecutionPolicy.PartialResults; 

        using (MultiShardDataReader sdr = cmd.ExecuteReader()) 
            { 
                while (sdr.Read())
                    { 
                        var c1Field = sdr.GetString(0); 
                        var c2Field = sdr.GetFieldValue<int>(1); 
                        var c3Field = sdr.GetFieldValue<Int64>(2);
                    } 
             } 
       } 
} 

Un'importante differenza risiede nella costruzione delle connessioni a più partizioni.A key difference is the construction of multi-shard connections. Mentre SqlConnection agisce su un singolo database, MultiShardConnection accetta come input una raccolta di partizioni.Where SqlConnection operates on a single database, the MultiShardConnection takes a collection of shards as its input. Popolare la raccolta di partizioni da una mappa partizioni.Populate the collection of shards from a shard map. La query viene quindi eseguita sulla raccolta di partizioni usando la semantica di UNION ALL per assemblare un unico risultato complessivo.The query is then executed on the collection of shards using UNION ALL semantics to assemble a single overall result. Facoltativamente, è possibile aggiungere all'output il nome della partizione di origine della riga usando la proprietà ExecutionOptions nel comando.Optionally, the name of the shard where the row originates from can be added to the output using the ExecutionOptions property on command.

Notare la chiamata a myShardMap.GetShards().Note the call to myShardMap.GetShards(). Questo metodo recupera tutte le partizioni dalla mappa partizioni e fornisce un metodo semplice per eseguire una query su tutti i database rilevanti.This method retrieves all shards from the shard map and provides an easy way to run a query across all relevant databases. La raccolta di partizioni per una query su più partizioni può essere ulteriormente perfezionata eseguendo una query LINQ sulla raccolta restituita dalla chiamata a myShardMap.GetShards().The collection of shards for a multi-shard query can be refined further by performing a LINQ query over the collection returned from the call to myShardMap.GetShards(). In combinazione con i criteri sui risultati parziali, la funzionalità corrente di query su più partizioni è stata progettata per supportare correttamente da decine fino a centinaia di partizioni.In combination with the partial results policy, the current capability in multi-shard querying has been designed to work well for tens up to hundreds of shards.

Un'attuale limitazione delle query su più partizioni è la mancanza di convalida delle partizioni e degli shardlet interrogati.A limitation with multi-shard querying is currently the lack of validation for shards and shardlets that are queried. Mentre il routing dipendente dai dati verifica che una determinata partizione faccia parte della mappa partizioni al momento dell'esecuzione delle query, le query su più partizioni non eseguono questo controllo.While data-dependent routing verifies that a given shard is part of the shard map at the time of querying, multi-shard queries do not perform this check. Questo può determinare l'esecuzione di query su più partizioni in database che sono stati rimossi dalla mappa partizioni.This can lead to multi-shard queries running on databases that have been removed from the shard map.

Query su più partizioni e operazioni di suddivisione e unioneMulti-shard queries and split-merge operations

Le query su più partizioni non verificano se gli shardlet presenti nel database interrogato sono oggetto di operazioni di divisione/unione in corso.Multi-shard queries do not verify whether shardlets on the queried database are participating in ongoing split-merge operations. Vedere Scaling using the Elastic Database split-merge tool (Ridimensionamento con lo strumento di divisione e unione del database elastico). Questo può causare incoerenze se righe dello stesso shardlet compaiono per più database nella stessa query su più partizioni.(See Scaling using the Elastic Database split-merge tool.) This can lead to inconsistencies where rows from the same shardlet show for multiple databases in the same multi-shard query. Tenere presente queste limitazioni e completare le operazioni di suddivisione-unione in corso e le modifiche alla mappa partizioni prima dell'esecuzione di query su più partizioni.Be aware of these limitations and consider draining ongoing split-merge operations and changes to the shard map while performing multi-shard queries.

Risorse aggiuntiveAdditional resources

Se non si usano gli strumenti di database elastici,Not using elastic database tools yet? vedere la Guida introduttiva.Check out our Getting Started Guide. Se ci sono domande, è possibile visitare il forum sul database SQL mentre è possibile inserire le richieste di nuove funzionalità nel forum relativo a commenti e suggerimenti sul database SQL.For questions, please reach out to us on the SQL Database forum and for feature requests, please add them to the SQL Database feedback forum.

Vedere ancheSee also

Classi e metodi System.Data.SqlClient.System.Data.SqlClient classes and methods.

Gestire le partizioni con la libreria client dei database elastici.Manage shards using the Elastic Database client library. Comprende uno spazio dei nomi denominato Microsoft.Azure.SqlDatabase.ElasticScale.Query, che consente di eseguire query su più partizioni usando una singola query con un unico risultato.Includes a namespace called Microsoft.Azure.SqlDatabase.ElasticScale.Query that provides the ability to query multiple shards using a single query and result. Fornisce l'astrazione delle query su una raccolta di partizioni,It provides a querying abstraction over a collection of shards. nonché criteri di esecuzione alternativi, in particolare risultati parziali, per la gestione degli errori quando si eseguono query su molte partizioni.It also provides alternative execution policies, in particular partial results, to deal with failures when querying over many shards.