视图的设计建议
Design advice on a view
我有一个视图 (ObjectFlattenedView
) 可以展平来自各种表和视图的数据点,其中包含与感兴趣的对象有关的所有内容。然后,Azure 搜索为我的 ui 索引此视图的输出,以便稍后发出搜索查询以找到相关记录。对象具有我们可能想要搜索的各种属性(视图中的列)。就对象数量和属性的不同来源而言,该视图很大 qui,因此性能是一个主要问题。
我有一个新属性需要添加到这个平面视图中。每个对象在此 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
。执行计划确实显示 ~8% 的总成本是这个 for xml
语句。我知道当我将更多 tables/views 加入到我的扁平化视图中时会对性能产生影响,但我受到影响的数量级是 quite 高。
如果我将我的 ObjectFlattenedView
直接外部联接到 TableN
,那么我的视图将具有对象的记录,这些记录等于 1 到该对象在 TableN 中的记录数。这使 Azure 搜索结果处理变得复杂,例如从搜索中获取多少条记录并进行分页,因为对象可以有 0 到 M 条来自 TableN
.
的记录
有没有人遇到过类似的问题,你有没有模式可以建议我在 sql 服务器端为 Azure 搜索提供适当的行集或在 Azure 搜索中处理这种情况一侧处理每个对象(文档)的 0:M 条记录?
不确定以下是否能完全解决您的问题,但它可能会有所帮助。一些观察:
您可以设置多个 datasource/indexer 对,而不是创建一个单一的 uber-view 来展平所有内容,所有这些都写入相同的搜索索引 - 只要它们都同意文档 ID ,您可以合并来自多个来源的数据和 assemble 您的 Azure 搜索文档。
为了处理值数组,Azure 搜索具有 Collection(Edm.String) 字段类型。由于 SQL 本身不支持数组,您可以生成 JSON 数组格式的字符串字段(例如 ["a"、"b"、"c"])并使用 this article 中描述的 jsonArrayToStringCollection 函数。
HTH!
我有一个视图 (ObjectFlattenedView
) 可以展平来自各种表和视图的数据点,其中包含与感兴趣的对象有关的所有内容。然后,Azure 搜索为我的 ui 索引此视图的输出,以便稍后发出搜索查询以找到相关记录。对象具有我们可能想要搜索的各种属性(视图中的列)。就对象数量和属性的不同来源而言,该视图很大 qui,因此性能是一个主要问题。
我有一个新属性需要添加到这个平面视图中。每个对象在此 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
。执行计划确实显示 ~8% 的总成本是这个 for xml
语句。我知道当我将更多 tables/views 加入到我的扁平化视图中时会对性能产生影响,但我受到影响的数量级是 quite 高。
如果我将我的 ObjectFlattenedView
直接外部联接到 TableN
,那么我的视图将具有对象的记录,这些记录等于 1 到该对象在 TableN 中的记录数。这使 Azure 搜索结果处理变得复杂,例如从搜索中获取多少条记录并进行分页,因为对象可以有 0 到 M 条来自 TableN
.
有没有人遇到过类似的问题,你有没有模式可以建议我在 sql 服务器端为 Azure 搜索提供适当的行集或在 Azure 搜索中处理这种情况一侧处理每个对象(文档)的 0:M 条记录?
不确定以下是否能完全解决您的问题,但它可能会有所帮助。一些观察:
您可以设置多个 datasource/indexer 对,而不是创建一个单一的 uber-view 来展平所有内容,所有这些都写入相同的搜索索引 - 只要它们都同意文档 ID ,您可以合并来自多个来源的数据和 assemble 您的 Azure 搜索文档。
为了处理值数组,Azure 搜索具有 Collection(Edm.String) 字段类型。由于 SQL 本身不支持数组,您可以生成 JSON 数组格式的字符串字段(例如 ["a"、"b"、"c"])并使用 this article 中描述的 jsonArrayToStringCollection 函数。
HTH!