简单易用,使 Power BI 用户能够快速收集数据并生成有趣且强大的报表,从而做出智能业务决策,也允许用户轻松生成性能不佳的查询。 当有两个表与外键关联 SQL 表或 SharePoint 列表的方式相关时,通常会发生这种情况。 (对于记录,此问题不特定于 SQL 或 SharePoint,并且发生在许多后端数据提取方案中,尤其是架构流畅且可自定义的位置。在共享通用密钥的单独表中存储数据本身也没有什么问题,事实上,这是数据库设计和规范化的基本原则。 但这确实意味着存在一种更好的方式来扩大这种关系。
请考虑 SharePoint 客户列表的以下示例。
它引用的以下位置列表。
首次连接到列表时,位置将显示为记录。
此顶级数据是通过对 SharePoint API 的单个 HTTP 调用(忽略元数据调用)收集的,你可以在任何 Web 调试器中看到这些数据。
展开记录时,会看到从辅助表中连接的字段。
将相关行从一个表扩展到另一个表时,Power BI 的默认行为是生成对Table.ExpandTableColumn的调用。 可以在生成的公式字段中看到这一点。 遗憾的是,此方法为第一个表中的每一行生成对第二个表的单独调用。
这会将主列表中的每一行的 HTTP 调用数增加一个。 在上述五行或六行示例中,这似乎并不多,但在 SharePoint 列表达到数十万行的生产系统中,这可能会导致显著体验下降。
当查询达到此瓶颈时,最佳缓解措施是使用经典表联接来避免每行调用行为。 这可确保只需发出一次调用来检索第二个表,其余的扩展可以在内存中使用两个表之间的共同键进行。 在某些情况下,性能差异可能很大。
首先,从原始表开始,注意你要扩展的列,并确保你有项的 ID,以便可以匹配它。 通常,外键的名称类似于追加 ID 的列的显示名称。 在此示例中,它是 LocationId。
其次,加载辅助表,确保包含 ID,即外键。 右键单击“查询”面板以创建新查询。
最后,使用匹配的相应列名联接这两个表。 通常可以通过先展开列来查找此字段,然后在预览中查找匹配的列。
在此示例中,可以看到主列表中的 LocationId 与辅助列表中的 ID 匹配。 UI 将此重命名为 Location.Id 以使列名唯一。 现在,让我们使用此信息来合并表。
右键单击查询面板并选择“ 新建查询>合并>合并查询”,可看到一个友好的 UI 来帮助合并这两个查询。
从下拉列表中选择每个表以查看查询预览。
选择这两个表后,请选择用于逻辑联接这两个表的列(在此示例中,它是主表中的 LocationId 和次表中的 ID )。 该对话框将告诉有多少行使用该外键进行了匹配。 你可能希望对此类数据使用默认联接类型(左外部)。
选择 “确定 ”,你将看到一个新查询,这是联接的结果。 现在展开记录并不意味着对后端进行额外调用。
刷新此数据只会对 SharePoint 进行两次调用-一次用于主列表,一次用于辅助列表。 联接将在内存中执行,显著减少了对 SharePoint 的调用数。
此方法可用于 PowerQuery 中具有匹配外键的任何两个表。
注释
SharePoint 用户列表和分类也可以作为表进行访问,并且可以按照上述方式进行联接,前提是用户有足够的权限访问这些列表。