使用Azure表存储时,我遇到了巨大的性能瓶颈.我的愿望是使用表作为一种缓存,因此一个漫长的过程可能会导致数百到数千行的数据.然后可以通过分区和行键快速查询数据.
查询工作速度非常快(仅使用分区和行键时速度极快,速度稍慢,但在搜索特定匹配项的属性时仍然可以接受).
但是,插入和删除行都非常慢.
澄清
我想澄清一下,即使插入一批100件物品也需要几秒钟.这不仅仅是数千行总吞吐量的问题.当我只插入100时,它正在影响我.
以下是我的代码批量插入到我的表中的示例:
static async Task BatchInsert( CloudTable table, List<ITableEntity> entities )
{
int rowOffset = 0;
while ( rowOffset < entities.Count )
{
Stopwatch sw = Stopwatch.StartNew();
var batch = new TableBatchOperation();
// next batch
var rows = entities.Skip( rowOffset ).Take( 100 ).ToList();
foreach ( var row in rows )
batch.Insert( row );
// submit
await table.ExecuteBatchAsync( batch );
rowOffset += rows.Count;
Trace.TraceInformation( "Elapsed time to batch insert " + rows.Count + " rows: " + …Run Code Online (Sandbox Code Playgroud) 我是学习Unicode的新手,不知道我需要根据我的ASCII背景学到多少东西,但是我正在阅读C#规范中的标识符规则,以确定Azure表中允许使用哪些字符(这是直接基于C#规范).
我在哪里可以找到属于这些类别的Unicode字符列表:
letter-character:类Lu,Ll,Lt,Lm,Lo或Nl的Unicode字符combining-character:Mn或Mc类的Unicode字符decimal-digit-character:类Nd的Unicode字符connecting-character:类Pc的Unicode字符 formatting-character:Cf类的Unicode字符 我使用Azure表存储有一个非常奇怪的问题.我在Visual Studio 2012中有一个.NET 4.5项目,我处理所有Azure表存储功能.这个项目/ dll由另外两个项目引用,我的MVC网站和我的Azure工作者角色.(我在我的机器上的Azure Emulators下运行,但是当我将它部署到云时也会发生这种情况)
我保存或检索记录时调用以下函数:
internal static CloudTable GetTable(CloudStorageAccount storageAccount, string tableReference)
{
CloudTableClient tableClient = storageAccount.CreateCloudTableClient();
CloudTable table = tableClient.GetTableReference(tableReference);
table.CreateIfNotExists();
return tableClient.GetTableReference(table.Name);
}
Run Code Online (Sandbox Code Playgroud)
在我的MVC网站中,我有一个将记录保存到Azure存储表的功能,然后在我的Azure工作者角色中有一个将读取记录的服务.
因此,两者都使用相同的dll进行存储和检索,但是我的MVC项目在保存记录时没有问题,但是当我尝试检索记录时,我的Azure Worker角色服务在尝试执行"table.CreateIfNotExists()时抛出异常;".
无法加载文件或程序集"Microsoft.Data.OData,Version = 5.2.0.0,Culture = neutral,PublicKeyToken = 31bf3856ad364e35"或其依赖项之一.定位的程序集的清单定义与程序集引用不匹配.(HRESULT异常:0x80131040)
我已经做了以下事情:
我还没有将dll推回到5.2,因为我在其他项目中遇到太多问题,我使用的功能从5.3开始具体.
我目前正在5.5上运行所有的dll.
当我运行此处找到的AsmSpy.exe实用程序时,我得到以下输出,我不是100%确定如何解释.
> Reference: Microsoft.Data.Edm
> 5.5.0.0 by Microsoft.Data.OData
> 5.5.0.0 by Microsoft.Data.Services.Client
> 5.5.0.0 by Microsoft.WindowsAzure.ActiveDirectory.GraphHelper.2013_04_05
> Reference: System.Spatial
> 5.5.0.0 by Microsoft.Data.OData
> 5.5.0.0 by Microsoft.Data.Services.Client Reference: Microsoft.Data.OData
> 5.5.0.0 by Microsoft.Data.Services.Client …Run Code Online (Sandbox Code Playgroud) 我正在使用Azure表存储来存储数据.我对何时使用insert-or-replace和insert-or-merge感到困惑.我正在使用Azure SDK 1.7.
我对插入或替换的理解是,如果实体存在,则用新实体替换先前实体的整个属性.如果新实体未定义属性或属性值为null,则在更新时将删除该属性.
在插入或合并中,即使新实体未在新实体中定义新属性,也将保留旧属性.我的理解是否正确?
Mahender
Azure TableStorage RowKeys中是否存在受限制的字符模式?我无法通过大量搜索找到任何记录.但是,我在一些性能测试中得到了这样的行为.
我有一些奇怪的行为,RowKeys包含随机字符(测试驱动程序确实阻止了受限字符(/ \#?)并阻止在RowKey中发生单引号).结果是我有一个RowKey,可以很好地插入到表中,但无法查询(结果是InvalidInput).例如:
RowKey: 9}5O0J=5Z,4,D,{!IKPE,~M]%54+9G0ZQ&G34!G+
Run Code Online (Sandbox Code Playgroud)
尝试通过此RowKwy(相等)进行查询将导致错误(在我们的应用程序中,使用Azure存储资源管理器和Cloud Storage Studio 2).我看了一下通过Fiddler发送的请求:
GET /foo()?$filter=RowKey%20eq%20'9%7D5O0J=5Z,4,D,%7B!IKPE,~M%5D%54+9G0ZQ&G34!G+' HTTP/1.1
Run Code Online (Sandbox Code Playgroud)
看起来RowKey中的%54未在过滤器中转义.有趣的是,对于包含此RowKey的批处理XML中包含URI的表存储的批处理请求,我得到了类似的行为.我也看到RowKeys使用嵌入式双引号的类似行为,但我尚未分离出该模式.
有没有人陪我这个行为?我可以很容易地限制RowKeys中出现的其他字符,但是我们真的想知道"规则".
这两个组件之间有什么区别,我应该何时使用它们?我发现它们之间存在类名冲突,所以我想我应该只使用一个.
例子
Microsoft.WindowsAzure.Storage有Microsoft.WindowsAzure.Storage.Table.CloudTableClient
Microsoft.WindowsAzure.StorageClient 具有 Microsoft.WindowsAzure.StorageClient.CloudTableClient
这看起来很混乱.我无法想象微软打算将它们都用在同一个项目中.
这是一个相当大的话题,blobs vs tables vs SQL,尽管我到目前为止所阅读的内容还是找不到适当的推理.
我们有一个多租户SaaS Web应用程序,我们即将迁移到Azure.我们使用SQL Server 2008数据库.我们存储属于文档的文档和日志信息.有点像Dropbox.
论坛声明,在考虑"大型"对象时,最好使用Azure表.我们通常每个用户存储数百个文档,文档大小从5kb到30mb不等,绝大多数都在1MB左右?
什么时候去Blob,Tables,Sql有什么基本规则?我已经知道我不应该将文档存储在SQL中,因为它太贵了.但是什么时候将文件存储在Blob中变得"有益",何时我会更好地使用表格?是否有某种公式如:
if (objects * MB/object * objectrequested > y) then blobs, else tables
azure azure-storage-blobs azure-table-storage azure-sql-database
如何在Azure表存储上设置多个过滤器?
这就是我尝试过的:
string partitionFilter = TableQuery.GenerateFilterCondition("PartitionKey", QueryComparisons.Equal, "partition1");
string date1 = TableQuery.GenerateFilterCondition("Date", QueryComparisons.GreaterThanOrEqual, "31-8-2013T14:15:14Z");
string date2 = TableQuery.GenerateFilterCondition("Date", QueryComparisons.LessThanOrEqual, "31-8-2013T14:15:14Z");
string finalFilter = TableQuery.CombineFilters(partitionFilter, TableOperators.And, date1);
Run Code Online (Sandbox Code Playgroud)
这不起作用,因为TableQuery.CombineFilters()只需要3个参数.我需要第二个日期的额外参数.
我的第二次尝试:
string filter = "PartitionKey eq 'partition1' and Date ge datetime'31-8-2013T14:15:14Z' and Date lt datetime'31-8-2013T14:19:10Z'";
TableQuery<CustomEntity> query = new TableQuery<CustomEntity>().Where(filter).Take(5);
Run Code Online (Sandbox Code Playgroud)
这回来了400 bad request.但是如果我删除了'datetime'它会运行但是返回没有结果,而它应该返回几个100条记录.
根据msdn的这个文档,这就是应该如何格式化日期时间.
我的结果应该是两个日期之间的所有记录.
我怎样才能做到这一点?
从worker/web角色读取设置的最佳方式/推荐方法是什么?
是吗:
CloudConfigurationManager.GetSetting("ConnectionString") (我正在使用)
要么
RoleEnvironment.GetConfigurationSettingValue("ConnectionString")
虽然两者都很好......

我正在为我的新项目选择数据库技术.我想知道Azure DocumentDB和Azure表存储之间的主要区别是什么?
似乎DocumentDB的主要优点是全文搜索和丰富的查询功能.如果我理解正确,我就不需要单独的搜索引擎库,如Lucene/Elasticsearch.
另一方面,Table Storage便宜得多.
可能影响我决定的其他差异是什么?