可以查询具有多个PK的表存储分区

时间:2018-07-01 01:12:34

标签: c# azure azure-table-storage

我的问题:如何在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的不同ID的数据,我使用了以下代码。以下代码段中的signalIDsList<string>

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

                });

方法ReadAllAt(...)具有以下代码,并为每个信号ID调用

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;

但是当数据非常庞大时,比如说30K ...会有很大的延迟。

我们如何减少性能问题?请提出建议。

0 个答案:

没有答案