2016-03-03 111 views
0

我有一个视图(ObjectFlattenedView),它将来自各种表和视图的数据点展平,其中包含与感兴趣的对象有关的所有内容。然后,Azure搜索将此视图的输出索引为我的用户界面,以便稍后发出搜索查询以查找相关记录。对象具有我们可能想要搜索的各种属性(视图中的列)。就目标数量和属性的不同来源而言,视图是相当大的,因此性能是一个主要关注点。关于视图的设计建议

我有一个新的属性,我需要添加到这个扁平视图。每个对象在这个TableN它具有以下结构

ObjectId SubNo SubValue 
A   Sub5 0 
B   Sub1 0 
B   Sub2 1 
B   Sub.. .. 
B   SubK 0   

现在我需要添加这个新属性(AttrN)有0到多条记录,这样我可以索引的对象文档(如天青搜索调用它)包含本新属性。扁平的看法是这样的:

ObjectId Attr1...  AttrN  
A  abc.....  {Sub5:0} 
B  abd.....  {Sub1:0,Sub2:1,...SubK:0} 

我的困境是:

如果我平了补充一点,串接对象的不同子值的CTE,视图的性能恶化200%至700%。该cte使用mssql的stufffor xml。执行计划确实显示总成本的〜8%为此for xml声明。我知道这会对性能产生影响,因为我将更多的表格/视图添加到扁平视图中,但是我受到的影响程度相当高。

如果我外面加入我的ObjectFlattenedView直接TableN,那么我的视图将具有对象的记录等于1对象在TableN中的记录数。这使Azure搜索结果处理变得复杂化,例如从搜索中获取多少条记录并执行分页,因为对象可能有来自TableN的0到M条记录。

有没有人遇到类似的问题,你有模式,你可以建议我处理这种情况要么在SQL服务器端提供适当的行集或Azure搜索端处理0:每个对象(文档)的M个记录?

回答

1

不确定下面是否会完全解决您的问题,但可能有帮助。一些观察:

  1. 而不是创建一个单一的尤伯杯视图压扁的一切,你可以设置多个数据源/索引对所有写入相同的搜索索引 - 只要他们都对文档ID一致,您可以合并数据并从多个来源逐个组装您的Azure搜索文档。

  2. 要处理值数组,Azure搜索具有Collection(Edm.String)字段类型。由于SQL本身不支持数组,因此可以使用JSON数组格式(例如[“a”,“b”,“c”])生成字符串字段,并使用this article中描述的jsonArrayToStringCollection函数。

HTH!