想象一下社交网络应用。用户关注其他用户和用户拍照。照片上有其他用户的标签。
我试图为该应用程序获得有效的Cosmos数据库实现图表。我提供了SQL Server版本以及基准测试。
以下是它的表格版本:
以下是Gremlin查询:
g.V('c39f435b-350e-4d08-a7b6-dfcadbe4e9c5')
.out('follows').as('name')
.out('took').order(local).by('postedAt', decr).as('id', 'postedAt')
.select('id', 'name', 'postedAt').by(id).by('name').by('postedAt')
.limit(10)
这是等效的SQL查询(实际上是linq):
Follows
.Where(f => f.FollowerId == "c39f435b-350e-4d08-a7b6-dfcadbe4e9c5")
.Select(f => f.Followees)
.SelectMany(f => f.Photos)
.OrderByDescending(f => f.PostedAt)
.Select(f => new { f.User.Name, f.Id, f.PostedAt})
.Take(10)
该用户跟踪了136个用户,他们共同拍摄了257张照片。
SQL Server和Cosmos数据库都位于West Europe Azure位置。我在法国。 我在Linpad上做了一些测试。
如何使用cosmos db更快更便宜地获取Feed?
注意:为了收取RU费用,我使用Microsoft.Azure.Graph
。但我也可以使用Gremlin.Net
并得到类似的结果。
答案 0 :(得分:2)
我知道这个问题很老,但这是我的提示,可帮助您有效使用cosmos db
并尽可能减少RU/s
。
330 RU
对于这样的查询来说很多,这里的问题使您消耗大量的RU
是分区,当您向数据库中添加分区时,您正在告诉cosmos db
通过您提供的分区键对数据进行逻辑分区,因此,在您的情况下,最好的分区键是用户。
通常,为了了解最佳的分区键,您应该首先从查询开始,例如,写下所有查询并检查筛选查询所用的top属性或字段是什么,以获取数据。您选择的属性是分区键。
如果您未添加分区键,则会告诉cosmosdb
搜索用户,并且如果用户在扩展时分散在许多服务器和多个分区上,则cosmosdb
将在所有分区(服务器),这会花费您很多钱,因此,如果您有6台服务器,cosmosdb
将在6台服务器上运行查询,直到找到您的用户为止,它可能会在第一台服务器中找到它,或者在第二台服务器中找到它,在最后一台服务器上找到它,这将花费很多时间,并且无法保证。
第二件事是containers
,容器是cosmosdb
中缩放的单位,因此当cosmosdb
要缩放时,它将缩放容器及其中的所有数据。因此,一个好的做法是在自己的容器中添加经常查询的实体,以便cosmosdb
可以使用分配给每个容器的分区键轻松缩放它们。
也许我以其他方式帮助您减少了RU/s
。希望这个答案可以帮助面临同样问题的人。
答案 1 :(得分:0)
如果您没有注意到,除了关系模型之外,SQL Server还has a graph model,您可以直接在SQL Server中使用图查询。
我还看到您没有使用任何partition key,这意味着Graph查询会慢很多。
几个月前,对于一种新产品,我们最初进行了几次测试,就像您进行的那样。当记录的数量更多(大约100K的数量,并且图形遍历的数量超过3)时,Cosmos比Azure SQL便宜。