Multi-shard-frågor med hjälp av elastiska databasverktyg
Gäller för:Azure SQL Database
Översikt
Med elastic database-verktygen kan du skapa fragmenterade 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.)
- Hämta en RangeShardMap (Java, .NET) eller ListShardMap (Java, .NET) med hjälp av metoden TryGetRangeShardMap (Java, .NET), TryGetListShardMap (Java, .NET) eller Metoden GetShardMap (Java, .NET). Se Skapa en ShardMapManager och Hämta en RangeShardMap eller ListShardMap.
- Skapa ett Objekt för MultiShard Anslut ion (Java, .NET).
- Skapa en MultiShardStatement eller MultiShardCommand (Java, .NET).
- Ange egenskapen CommandText (Java, .NET) till ett T-SQL-kommando.
- Kör kommandot genom att anropa metoden ExecuteQueryAsync eller ExecuteReader (Java, .NET).
- Visa resultaten med klassen MultiShardResultSet eller MultiShardDataReader (Java, .NET).
Exempel
Följande kod illustrerar användningen av multi-shard-frågor 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 Sql Anslut ion fungerar på en enskild databas tar MultiShard Anslut ion en samling shards som indata. Fyll i samlingen med shards från en fragmentkarta. Frågan körs sedan på samlingen med shards med hjälp av UNION ALL-semantik för att sammanställa ett enda övergripande resultat. Alternativt kan namnet på shard där raden kommer från läggas till i utdata med hjälp av egenskapen ExecutionOptions 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 shards för en fråga med 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 shardletar i den efterfrågade databasen deltar i pågående åtgärder för delningssammanslagning. (Se Skalning med hjälp av verktyget för delad sammanfogning i Elastic Database.) 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 åtgärder för delad sammanfogning och ändringar av shardkartan när du utför frågor med flera fragment.
Ytterligare resurser
Använder du inte elastiska databasverktyg än? Kolla in vår komma igång-guide. Om du har frågor kan du kontakta oss på microsofts Q&A-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.