Share via


Abfragen mehrerer Shards mithilfe der Tools für elastische Datenbanken

Gilt für:Azure SQL-Datenbank

Überblick

Mit den Tools für elastische Datenbankenkönnen Sie die horizontal partitionierten Datenbanklösungen erstellen. Abfragen von mehreren Shards wird für Aufgaben wie Datensammlung/Berichterstellung verwendet, für die das Ausführen einer Abfrage über mehrere Shards erforderlich ist. (Vergleichen Sie dies mit dem datenabhängigen Routing, bei dem die gesamte Arbeit in einem einzigen Shard durchgeführt wird.)

  1. Rufen Sie RangeShardMap (Java, .NET) oder ListShardMap (Java, .NET) mithilfe der Methode TryGetRangeShardMap (Java, .NET), TryGetListShardMap (Java, .NET) oder GetShardMap (Java, .NET) ab. Weitere Informationen finden Sie unter Erstellen eines ShardMapManager und Abrufen einer RangeShardMap oder ListShardMap.
  2. Erstellen Sie ein MultiShardConnection-Objekt (Java, .NET).
  3. Erstellen Sie ein MultiShardStatement- oder MultiShardCommand-Objekt (Java, .NET).
  4. Legen Sie die CommandText-Eigenschaft (Java, .NET) auf einen T-SQL-Befehl fest.
  5. Führen Sie den Befehl durch Aufrufen der Methode ExecuteQueryAsync oder ExecuteReader (Java, .NET) auf.
  6. Zeigen Sie die Ergebnisse mithilfe der Klasse MultiShardResultSet oder MultiShardDataReader (Java, .NET) an.

Beispiel

Das folgende Codebeispiel veranschaulicht die Verwendung von Abfragen mehrerer Shards mithilfe eines bestimmten ShardMap -Elements mit dem Namen 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);
            }
        }
    }
}

Ein wichtiger Unterschied ist die Erstellung von Verbindungen mit mehreren Shards. Wenn SqlConnection in einer Einzeldatenbank ausgeführt wird, nimmt MultiShardConnection eine Shardsammlung als Eingabe. Füllen Sie die Sammlung von Shards aus einer Shard-Map auf. Die Abfrage wird dann mithilfe der UNION ALL -Semantik für die Sammlung von Shards ausgeführt, um ein einziges Gesamtergebnis zu erhalten. Optional kann der Name des Shards, aus dem die Zeile stammt, mithilfe der ExecutionOptions -Eigenschaft im Befehl der Ausgabe hinzugefügt werden.

Beachten Sie, dass myShardMap.GetShards() aufgerufen wird. Diese Methode ruft alle Shards aus der Shard-Zuordnung ab und stellt damit eine einfache Möglichkeit zum Ausführen einer Abfrage an alle Datenbanken bereit. Die Sammlung von Shards für eine Abfrage mehrerer Shards kann durch Ausführen einer LINQ-Abfrage über die Sammlung, die von dem Aufruf von myShardMap.GetShards() zurückgegeben wird, weiter optimiert werden. In Kombination mit der Teilergebnisrichtlinie wurde die aktuelle Funktion bei der Abfrage mehrerer Shards so entwickelt, dass diese gut mit bis zu Hunderten von Shards funktioniert.

Eine Einschränkung von Abfragen mehrerer Shards ist derzeit die fehlende Überprüfung von Shards und Shardlets, die abgefragt werden. Während beim datenabhängigem Routing überprüft wird, dass ob ein bestimmtes Shard Teil der Shard-Map zum Zeitpunkt der Abfrage ist, führen Abfragen mehrerer Shards dieses Überprüfung nicht durch. Dies kann dazu führen, dass Abfragen mehrerer Shards auf Datenbanken ausgeführt werden, die aus der Shard-Zuordnung entfernt wurden.

Abfragen mehrerer Shards und Aufteilungs-/Zusammenführungsvorgänge

Beim Abfragen mehrerer Shards wird nicht überprüft, ob Shardlets im abgefragten Shard an laufenden Aufteilungs-/Zusammenführungsvorgängen teilnehmen. (Siehe Skalierung mit dem Split-Merge-Tool für elastische Datenbanken.) Dies kann zu Inkonsistenzen führen, wenn Zeilen aus demselben Shardlet für mehrere Datenbanken in derselben Abfrage mehrerer Shards angezeigt werden. Beachten Sie diese Einschränkungen, und ziehen Sie beim Ausführen von Abfragen mehrerer Shards einen Ausgleich laufender Aufteilungs-/Zusammenführungsvorgänge und Änderungen an der Shard-Zuordnung in Betracht.

Zusätzliche Ressourcen

Verwenden Sie noch keine elastischen Datenbanktools? Sehen Sie sich unseren Leitfaden zu den ersten Schritten an. Wenden Sie sich bei Fragen auf der Frageseite von Microsoft Q&A für SQL-Datenbank und für Featureanforderungen an uns, fügen Sie neue Ideen hinzu, oder stimmen Sie im SQL-Datenbank-Feedbackforumüber vorhandene Ideen ab.