Udostępnij za pośrednictwem


Wykonywanie zapytań wieloczęściowych przy użyciu narzędzi elastycznej bazy danych

Dotyczy: Azure SQL Database

Omówienie

Za pomocą narzędzi Elastic Database można tworzyć rozwiązania bazy danych podzielone na fragmenty. Wykonywanie zapytań wieloczęściowych jest używane w przypadku zadań, takich jak zbieranie/raportowanie danych, które wymagają uruchomienia zapytania rozciągającego się na kilka fragmentów. (Kontrastuj z routingiem zależnym od danych, który wykonuje całą pracę na jednym fragmentie).

  1. Pobierz element RangeShardMap (Java, .NET) lub ListShardMap (Java, .NET) przy użyciu metody TryGetRangeShardMap (Java, .NET), TryGetListShardMap (Java, .NET) lub Metody GetShardMap (Java, .NET). Zobacz Tworzenie elementu ShardMapManager i Pobieranie elementu RangeShardMap lub ListShardMap.
  2. Utwórz obiekt MultiShardConnection (Java, .NET).
  3. Utwórz wartość MultiShardStatement lub MultiShardCommand (Java, .NET).
  4. Ustaw właściwość CommandText (Java, .NET) na polecenie T-SQL.
  5. Wykonaj polecenie, wywołując metodę ExecuteQueryAsync lub ExecuteReader (Java, .NET).
  6. Wyświetl wyniki przy użyciu klasy MultiShardResultSet lub MultiShardDataReader (Java, .NET).

Przykład

Poniższy kod ilustruje użycie zapytań wieloczęściowych przy użyciu danej mapy fragmentów o nazwie 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);
            }
        }
    }
}

Kluczową różnicą jest budowa połączeń wieloczęściowych. W przypadku, gdy program SqlConnection działa w pojedynczej bazie danych, funkcja MultiShardConnection pobiera kolekcję fragmentów jako dane wejściowe. Wypełnij kolekcję fragmentów z mapy fragmentów. Zapytanie jest następnie wykonywane w kolekcji fragmentów przy użyciu semantyki UNION ALL w celu utworzenia pojedynczego ogólnego wyniku. Opcjonalnie nazwa fragmentu, z którego pochodzi wiersz, można dodać do danych wyjściowych przy użyciu właściwości ExecutionOptions w poleceniu.

Zanotuj wywołanie metody myShardMap.GetShards(). Ta metoda pobiera wszystkie fragmenty z mapy fragmentów i umożliwia łatwe uruchamianie zapytania we wszystkich odpowiednich bazach danych. Kolekcję fragmentów dla zapytania wieloczęściowego można dodatkowo udoskonalić, wykonując zapytanie LINQ nad kolekcją zwróconą z wywołania do myShardMap.GetShards(). W połączeniu z zasadami częściowych wyników bieżąca funkcja wykonywania zapytań obejmujących wiele fragmentów została zaprojektowana tak, aby działała dobrze przez dziesiątki do setek fragmentów.

Ograniczenie dotyczące wykonywania zapytań obejmujących wiele fragmentów jest obecnie brakiem walidacji fragmentów i fragmentów, które są wykonywane względem zapytań. Chociaż routing zależny od danych sprawdza, czy dany fragment jest częścią mapy fragmentów w czasie wykonywania zapytań, zapytania wieloczęściowe nie wykonują tego sprawdzania. Może to prowadzić do wieloczęściowych zapytań uruchomionych w bazach danych, które zostały usunięte z mapy fragmentów.

Zapytania obejmujące wiele fragmentów i operacje dzielenia scalania

Zapytania obejmujące wiele fragmentów nie sprawdzają, czy fragmentlety bazy danych, których dotyczy zapytanie, uczestniczą w trwających operacjach dzielenia-scalania. (Zobacz Skalowanie przy użyciu narzędzia do dzielenia i scalania elastycznej bazy danych). Może to prowadzić do niespójności, w których wiersze z tego samego fragmentu pokazują dla wielu baz danych w tym samym zapytaniu wielofragmentowym. Należy pamiętać o tych ograniczeniach i rozważyć opróżnianie bieżących operacji scalania podzielonego i zmian w mapie fragmentów podczas wykonywania zapytań obejmujących wiele fragmentów.

Jeszcze nie korzystasz z narzędzi elastycznych baz danych? Zapoznaj się z naszym przewodnikiem Wprowadzenie. W przypadku pytań skontaktuj się z nami na stronie pytań i odpowiedzi dotyczących usługi SQL Database oraz w przypadku żądań funkcji, dodaj nowe pomysły lub zagłosuj na istniejące pomysły na forum opinii usługi SQL Database.