Dela via


Multi-shard-frågor med hjälp av elastiska databasverktyg

gäller för:Azure SQL Database

Översikt

Med Skala ut med Azure SQL Database kan du skapa shardade databaslösningar. Multi-shard-frågor används för uppgifter som datainsamling/rapportering som kräver att du kör en fråga som sträcker sig över flera shards. (Kontrastera detta till databeroende routning, som utför allt arbete på en enda shard.)

  1. Hämta en RangeShardMap (Java, .NET) eller ListShardMap (Java, .NET) med hjälp av TryGetRangeShardMap metoden (Java, .NET), TryGetListShardMap (Java, .NET) eller GetShardMap (Java, .NET). Se Skapa en ShardMapManager och Hämta en RangeShardMap eller ListShardMap.
  2. Skapa ett MultiShardConnection (Java, .NET)-objekt.
  3. Skapa en MultiShardStatement eller MultiShardCommand (Java, .NET).
  4. CommandText property Ange (Java, .NET) till ett T-SQL-kommando.
  5. Kör kommandot genom att anropa ExecuteQueryAsync metoden eller ExecuteReader (Java, .NET).
  6. Visa resultaten med klassen MultiShardResultSet eller MultiShardDataReader (Java, .NET).

Exempel

Följande kod illustrerar användningen av frågor med flera fragment med hjälp av en viss ShardMap med namnet 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);
            }
        }
    }
}

En viktig skillnad är konstruktionen av anslutningar med flera fragment. Där SqlConnection fungerar på en enskild databas tar MultiShardConnection en samling skärvor som indata. Fyll i samlingen med shards från en fragmentkarta. Sedan körs frågan på samlingen av fragment med UNION ALL semantik för att sammanställa ett enda övergripande resultat. Alternativt kan namnet på fragmentet där raden kommer från läggas till i utdata med hjälp av ExecutionOptions -egenskapen på kommandot.

Observera anropet till myShardMap.GetShards(). Den här metoden hämtar alla shards från fragmentkartan och ger ett enkelt sätt att köra en fråga över alla relevanta databaser. Samlingen med fragment för en fråga över flera fragment kan förfinas ytterligare genom att köra en LINQ-fråga över samlingen som returneras från anropet till myShardMap.GetShards(). I kombination med principen för partiella resultat har den aktuella funktionen i multi-shard-frågor utformats för att fungera bra för upp till hundratals shards.

En begränsning med multi-shard-frågor är för närvarande bristen på validering för shards och shardlets som efterfrågas. Även om databeroende routning verifierar att en viss shard är en del av shardkartan vid tidpunkten för frågor, utför frågor med flera shard inte den här kontrollen. Detta kan leda till flershardfrågor som körs på databaser som har tagits bort från fragmentkartan.

Multi-shard-frågor och åtgärder för delningssammanslagning

Multi-shard-frågor kontrollerar inte om shardlets i den ifrågavarande databasen deltar i pågående split-merge-operationer. (Se Flytta data mellan utskalade molndatabaser.) Detta kan leda till inkonsekvenser där rader från samma shardlet visas för flera databaser i samma multi-shard-fråga. Tänk på de här begränsningarna och överväg att tömma pågående split-merge-operationer och ändringar i shard-kartan när du utför frågor över flera fragment.

Använder du inte elastiska databasverktyg än? Kolla in vår komma igång-guide. För frågor kan du kontakta oss på Microsoft Q&En frågesida för SQL Database och för funktionsförfrågningar, lägga till nya idéer eller rösta på befintliga idéer i SQL Database-feedbackforumet.