【问题标题】:Design advice on a view关于视图的设计建议
【发布时间】: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 的stufffor xml。执行计划确实显示该 for xml 语句占总成本的约 8%。我知道当我将更多表/视图加入我的扁平视图中时会产生性能影响,但我受到的影响的数量级非常高。

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

有没有人遇到过类似的问题,您是否有可以建议我处理这种情况的模式,或者在 sql 服务器端为 Azure 搜索提供正确的行集,或者在 Azure 搜索端处理 0:M每个对象(文档)的记录?

【问题讨论】:

    标签: sql-server tsql azure-cognitive-search


    【解决方案1】:

    不确定以下是否能完全解决您的问题,但它可能会有所帮助。几点观察:

    1. 您可以设置多个数据源/索引器对,全部写入同一个搜索索引,而不是创建单个 uber-view 扁平化所有内容 - 只要它们都同意文档 ID,您就可以合并数据并从多个来源逐个组装您的 Azure 搜索文档。

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

    HTH!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-06-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-07-17
      • 2011-10-09
      • 2014-03-30
      • 2015-12-20
      相关资源
      最近更新 更多