升级到Microsoft.Azure.Cosmos.Table以访问Azure表存储后,性能降低

时间:2020-04-07 15:56:44

标签: azure azure-table-storage azure-sdk-.net

我们已升级到SDK的下一个版本,以访问Azure表存储。

此后,我们观察到应用程序的性能下降。我们甚至创建了具有相同使用模式的测试应用程序来隔离它,但仍然看到这种性能下降。

我们正在使用.NET Framework代码,从Azure表中读取数据。

旧客户端:Microsoft.WindowsAzure.Storage-9.3.2

新客户端:Microsoft.Azure.Cosmos.Table-1.0.6

这是我们尝试运行的示例测试之一:

public async Task ComparisionTest1()
{
    var partitionKey = CompanyId.ToString();

    {
        // Microsoft.Azure.Cosmos.Table
        var storageAccount = Microsoft.Azure.Cosmos.Table.CloudStorageAccount.Parse(ConnectionString);
        var tableClient = Microsoft.Azure.Cosmos.Table.CloudStorageAccountExtensions.CreateCloudTableClient(storageAccount);
        var tableRef = tableClient.GetTableReference("UserStatuses");
        var query = new Microsoft.Azure.Cosmos.Table.TableQuery<Microsoft.Azure.Cosmos.Table.TableEntity>()
                            .Where(Microsoft.Azure.Cosmos.Table.TableQuery.GenerateFilterCondition("PartitionKey", "eq", partitionKey));
        var result = new List<Microsoft.Azure.Cosmos.Table.TableEntity>(20000);

        var stopwatch = Stopwatch.StartNew();
        var tableQuerySegment = await tableRef.ExecuteQuerySegmentedAsync(query, null);
        result.AddRange(tableQuerySegment.Results);
        while (tableQuerySegment.ContinuationToken != null)
        {
            tableQuerySegment = await tableRef.ExecuteQuerySegmentedAsync(query, tableQuerySegment.ContinuationToken);
            result.AddRange(tableQuerySegment.Results);
        }

        stopwatch.Stop();
        Trace.WriteLine($"Cosmos table client. Elapsed: {stopwatch.Elapsed}");
    }

    {
        // Microsoft.WindowsAzure.Storage
        var storageAccount = Microsoft.WindowsAzure.Storage.CloudStorageAccount.Parse(ConnectionString);
        var tableClient = storageAccount.CreateCloudTableClient();
        var tableRef = tableClient.GetTableReference("UserStatuses");
        var query = new Microsoft.WindowsAzure.Storage.Table.TableQuery<Microsoft.WindowsAzure.Storage.Table.TableEntity>()
                            .Where(Microsoft.WindowsAzure.Storage.Table.TableQuery.GenerateFilterCondition("PartitionKey", "eq", partitionKey));
        var result = new List<Microsoft.WindowsAzure.Storage.Table.TableEntity>(20000);

        var stopwatch = Stopwatch.StartNew();
        var tableQuerySegment = await tableRef.ExecuteQuerySegmentedAsync(query, null);
        result.AddRange(tableQuerySegment.Results);
        while (tableQuerySegment.ContinuationToken != null)
        {
            tableQuerySegment = await tableRef.ExecuteQuerySegmentedAsync(query, tableQuerySegment.ContinuationToken);
            result.AddRange(tableQuerySegment.Results);
        }

        stopwatch.Stop();
        Trace.WriteLine($"Old table client. Elapsed: {stopwatch.Elapsed}");
    }
}

有人观察到它了吗?

2 个答案:

答案 0 :(得分:1)

我认为您的数据存储在旧版存储表中。以防万一,如果这是CosmosDB表支持的,则将TableClientConfiguration.UseRestExecutorForCosmosEndpoint设置为True,可能会获得更好的性能。

如果是旧版存储表存储,则CosmosDB表sdk 1.0.6的速度比存储表sdk 9.3.3慢15%。此外,它在第一次CRUD操作时会有额外的第二个开销。 1.0.7解决了更长的查询持续时间,这与Storage SDK相当。为何仍要使用CosmosDB Table sdk 1.0.7,所以仍然需要初始化第二秒。

我们计划在4/13的一周内发布1.0.7。

答案 1 :(得分:1)

性能问题将在Table SDK 1.0.7中得到解决,已通过大型实体验证。 在1.0.6上,解决方法是通过在app.config中添加诊断部分(如果它是.NET Framework应用程序)来禁用Table sdk跟踪。它仍然会比Storage sdk慢,但是比没有使用方法(取决于使用情况)要好得多。

相关问题