Разделы для хранения таблицы, чтобы иметь несколько PK могут быть запрошены - PullRequest
0 голосов
/ 01 июля 2018

Мой вопрос: как я смогу асинхронно выполнять запрос к хранилищу таблиц в Azure?

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

Для каждого сигнала есть огромные данные.

Мне нужно разбить большой объединенный запрос, как показано ниже, чтобы данные извлекались из каждого раздела асинхронно. Скажем, сначала запросить хранилище таблиц, чтобы получить данные для signal1, а затем для signal2 ... так, чтобы данные получали параллельно вместо текущей длительной задержки ожидания, которую я испытываю. Почти 12 разделов нужно будет отсканировать. Так что вроде как ниже

(((((((((((((PartitionKey eq 'D4AS1') or (PartitionKey eq 'D4AS2')) or (PartitionKey eq 'D4AS3')) or (PartitionKey eq 'D4AS4')) or (PartitionKey eq 'D4AS5')) or (PartitionKey eq 'D4AS6')) or (PartitionKey eq 'D4AS7')) or (PartitionKey eq 'D4AS8')) or (PartitionKey eq 'D4AS9')) or (PartitionKey eq 'D4AS10')) or (PartitionKey eq 'D4AS11')) or (PartitionKey eq 'D4AS133')) ...)

Редактировать

Чтобы получить данные для разных идентификаторов, относящихся к PK, я использовал приведенный ниже код. signalIDs в следующем фрагменте кода List<string>

Parallel.ForEach(signalIDs, (signalID) =>
                {
                    signalDataList = table.ReadAllAt(signalID, fromDateTimeOffset, toDateTimeOffset, "TimeReceivedTicks",true);
                    SignalDataListColl = SignalDataListColl.Concat(signalDataList).ToList();

                });

Метод ReadAllAt(...) имеет следующий код и вызывается для каждого сигнального идентификатора

public List<T> ReadAllAt(string partitionKey, DateTimeOffset fromDateTimeOffset, DateTimeOffset toDateTimeOffset, string timeField = "Timestamp", bool timeCheckByTicks = false)
        {
            T entity = new T();
            //TableQuery<T> query;

            string queryPK = TableQuery.GenerateFilterCondition("PartitionKey", QueryComparisons.Equal, partitionKey);
            string queryDateFrom = "";
            string queryDateTo = "";
            if(!timeCheckByTicks)
            { 
                queryDateFrom   = TableQuery.GenerateFilterConditionForDate(timeField, QueryComparisons.GreaterThanOrEqual, fromDateTimeOffset.DateTime);
                queryDateTo     = TableQuery.GenerateFilterConditionForDate(timeField, QueryComparisons.LessThanOrEqual, toDateTimeOffset.DateTime);
            }
            else
            { 
                queryDateFrom   = TableQuery.GenerateFilterConditionForLong(timeField, QueryComparisons.GreaterThanOrEqual, fromDateTimeOffset.DateTime.Ticks);
                queryDateTo     = TableQuery.GenerateFilterConditionForLong(timeField, QueryComparisons.LessThanOrEqual, toDateTimeOffset.DateTime.Ticks); 
            }
            var queryCombined    = TableQuery.CombineFilters(
                        TableQuery.CombineFilters(
                            queryPK,
                            TableOperators.And,
                            queryDateFrom),
                        TableOperators.And, queryDateTo);
            TableQuery<T> query = new TableQuery<T>().Where(queryCombined);
            List<T> tableSet = table.ExecuteQuery(query).ToList();
            if(tableSet == null) tableSet = new List<T>(); 
            return tableSet;

Но, тем не менее, когда данные очень велики, скажем, 30 КБ ... существует значительная задержка.

Как мы можем уменьшить проблему производительности? Пожалуйста, предложите.

...