Многосегментное формирование запросов с использованием средств работы с эластичными базами данных

Применимо к:База данных SQL Azure

Обзор

Средства работы с эластичными базами данныхпозволяют создавать решения сегментированных баз данных. Многосегментное формирование запросов используется для таких задач, как сбор данных и создание отчетов, требующих запуска запроса, распространяющегося на несколько сегментов. (Сравните с маршрутизацией, зависящей от данных, когда все действия выполняются в пределах одного сегмента.)

  1. Получение RangeShardMap (Java, .NET) или ListShardMap (Java, .NET) с помощью методов TryGetRangeShardMap (Java, .NET), TryGetListShardMap (Java, .NET) или GetShardMap (Java, .NET). Обратитесь к разделам Создание объекта ShardMapManager и Получение RangeShardMap или ListShardMap.
  2. Создание объекта MultiShardConnection (Java, .NET).
  3. Создание объекта MultiShardStatement или MultiShardCommand (Java, .NET).
  4. Задание для свойства CommandText (Java, .NET) команды T-SQL.
  5. Выполнение команды путем вызова метода ExecuteQueryAsync или ExecuteReader (Java, .NET).
  6. Просмотр результатов с помощью класса MultiShardResultSet или MultiShardDataReader (Java, .NET).

Пример

В следующем примере кода показано применение многосегментного формирования запросов с использованием заданного сопоставления ShardMap с именем 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);
            }
        }
    }
}

Основное различие состоит в построении многосегментных подключений. Если SqlConnection действует для отдельной базы данных, то MultiShardConnection принимает в качестве входных данных коллекцию сегментов. Коллекция сегментов заполняется из карты сегментов. Затем выполняется запрос для коллекции сегментов с использованием семантики UNION ALL для формирования общего результата. При необходимости к выходным данным можно добавить имя сегмента, из которого поступает строка, используя свойство ExecutionOptions команды.

Обратите внимание на вызов myShardMap.GetShards(). С помощью этого метода все сегменты извлекаются из карты сегментов, и обеспечивается простой способ выполнения запроса по всем соответствующим базам данных. Коллекцию сегментов для многосегментного запроса можно дополнительно ограничить, выполнив запрос LINQ к коллекции, полученной в результате вызова myShardMap.GetShards(). Эта возможность в многосегментном формировании запросов, в сочетании с политикой частичных результатов, разработана для применения к сегментам в количестве от десятков до сотен.

В настоящий момент существует ограничение для многосегментного формирования запросов, состоящее в отсутствии проверки для сегментов и шардлетов, к которым обращен запрос. Если при маршрутизации, зависящей от данных, выполняется проверка того, что указанный сегмент является частью карты сегментов на момент выполнения запроса, то при многосегментном формировании запросов такая проверка не происходит. Это может привести к тому, что многосегментные запросы будут обращаться к базам данных, удаленным из карты сегментов.

Многосегментные запросы и операции разбиения-слияния

При многосегментных запросах не выполняется проверка на участие шардлетов из запрашиваемой базы данных в операциях разбиения или слияния. (См. статью Масштабирование с использованием инструмента разбиения и объединения эластичных баз данных.) Это может привести к несогласованности, когда строки одного шардлета отображаются для нескольких баз данных в одном многосегментном запросе. Следует учитывать эти ограничения, фильтрование текущих операций разбиения или слияния, а также изменения сопоставления сегментов при выполнении многосегментных запросов.

Дополнительные ресурсы

Еще не используете средства эластичных баз данных? Ознакомьтесь с нашим руководством по началу работы. Возникшие вопросы вы можете задать нам на странице вопросов Microsoft Q&A по Базе данных SQL. Что касается запросов новых функций, вы можете поделиться новыми идеями или проголосовать за существующие на форуме отзывов по Базе данных SQL.