有没有办法围绕500个实体/秒/分区与ATS(Azure表存储)?好的脏读 . 如果插入不能立即读取,则确定 .
希望将一些大型表从SQL移动到ATS .
-
Scale:由于这些表的大小超过了SQL Azure的150 GB限制
-
插入速度:查询速度的倒排索引 . 插入顺序不按表聚集索引排序,这会导致快速SQL表碎片 . ATS很可能比SQL具有插入优势 .
-
成本:ATS的月费较低 . 但是ATS的负载成本高达数百万行,并且不能批量处理,因为负载的顺序不是分区 .
-
查询速度:搜索几乎从不在一个partitionKey上 . 搜索将具有SQL组件和零个或多个ATS组件 . 此ATS查询始终由partitionKey和返回rowKeys . 对partitionKey的原始搜索很快,问题是返回实体(行)的时间 . 给定的partitionKey平均有1,000个rowKeys,在500个实体/秒/分区时为2秒 . 但是会有一些partitionKey拥有超过100,000个rowKeys,相当于超过3分钟 . 一次返回10,000行,并且在SQL中没有查询超过10秒,因为连接的功能不必降低100,000行以在那里考虑这些行 .
-
这个选择实体的速度是否与ATS有关?对于比例和插入速度,想转到ATS .
Windows Azure Storage Abstractions and their Scalability Targets
How to get most out of Windows Azure Tables
Designing a Scalable Partitioning Strategy for Windows Azure Table Storage
关闭实体跟踪以查找不会被修改的查询结果:context.MergeOption = MergeOption.NoTracking;
2 回答
一种可能的解决方法是跨多个分区和/或表划分数据,并行地跨所有(子)分区执行查询并合并结果 .
例如,对于跨分区的条带化,使用单个数字前置分区键可以使分区的可伸缩性倍增10倍 .
因此,分区键(例如ABCDEFGH)可以将0ABCDEFGH子分区为9ABCDEFGH .
写入分区,前缀数字随机生成或以循环方式生成 . 读取将并行查询所有10个分区并合并结果 .
对于跨表的条带化,N个表中的一个可以随机或以循环方式写入,并且可以类似地并行查询 .
编辑:我原先说过限制是500个事务/分区/秒 . 那是不对的 . 该限制实际上是500个实体/分区/秒,如原始问题中所述 .
这也适用于您计算的查询速度 . 如果您查询ATS PartitionKey并返回1000个实体,那么返回单个实体可能只需要更长的时间,也许几百毫秒 . 另一方面,如果查询返回超过1000个实体,则它将慢得多,因为每组1000行需要基本上独立的事务,并且必须以串行方式完成 .
我不清楚你在做什么,但听起来好像很多 . 请记住,在非键列上查询ATS往往非常慢 . 如果您正在做很多事情,那么使用SQL Azure Federations和扇出查询可能会更好 .