【发布时间】:2016-06-16 06:48:16
【问题描述】:
我有一个视图 (ObjectFlattenedView),它可以扁平化来自各种表和视图的数据点,其中包含与感兴趣对象有关的所有内容。然后,Azure 搜索为此视图的输出编制索引,以便我的 ui 稍后发出搜索查询以定位相关记录。对象具有我们可能想要搜索的各种属性(视图中的列)。就对象的数量和属性的不同来源而言,该视图非常大,因此性能是一个主要问题。
我有一个新属性需要添加到这个展平视图中。每个对象在这个 TableN 中有 0 到多个记录,其结构如下
ObjectId SubNo SubValue
A Sub5 0
B Sub1 0
B Sub2 1
B Sub.. ..
B SubK 0
现在我需要添加这个新属性 (AttrN),以便我可以索引包含这个新属性的对象文档(正如 Azure 搜索所调用的那样)。扁平化的视图是这样的:
ObjectId Attr1... AttrN
A abc..... {Sub5:0}
B abd..... {Sub1:0,Sub2:1,...SubK:0}
我的困境如下:
如果我完全添加一个连接对象的不同子值的 cte,视图的性能会下降 200% 到 700%。 cte 使用 mssql 的stuff 和for xml。执行计划确实显示该 for xml 语句占总成本的约 8%。我知道当我将更多表/视图加入我的扁平视图中时会产生性能影响,但我受到的影响的数量级非常高。
如果我将我的ObjectFlattenedView 直接外连接到TableN,那么我的视图中的对象记录将等于 1 到对象在 TableN 中的记录数。这使 Azure 搜索结果处理变得复杂,例如从搜索中获取多少记录并进行分页,因为对象可以有 0 到 M 个来自 TableN 的记录。
有没有人遇到过类似的问题,您是否有可以建议我处理这种情况的模式,或者在 sql 服务器端为 Azure 搜索提供正确的行集,或者在 Azure 搜索端处理 0:M每个对象(文档)的记录?
【问题讨论】:
标签: sql-server tsql azure-cognitive-search