手动将在此开发的上一个视图的基数设置为"1..1",并遍历所有字段,云服务器厂商,以便您可以构建视图。
确保字段"employee\u 1"确实来自左表。如果不是这样(例如。,因为您以稍微不同的方式构建模型)更改join节点中的列映射,以便"employee\u 1"仅引用左侧表。
视图成功构建后,请按下面突出显示的按钮调试视图:
通过选择节点"Semantics"并按调试按钮启动调试按钮。
将默认调试查询与只从左表请求字段的查询交换并运行查询(您可能需要调整视图名称):
选择
"salesOrder"、
"employee\u 1",
总和("金额")为
"金额"
来自
"联合基数1〃。"jo化身示例.db.CVs:JoinNoEstimateCardinality"
按
"salesforder"分组,人工智能是,网云服务器,私人云服务器,
"employee\u 1"
执行的调试查询以灰色显示修剪的节点和字段:
修剪的节点和字段以灰色文本表示
根据灰显的对象,您可以得出以下结论:确实"employees"被删掉了,
删减是可能的,因为
a)没有向employees请求任何字段("employee1"来自左表),
b)只涉及左外连接,因此执行连接时不能删除任何记录,和
c)设置基数,以便通过执行联接不会增加记录的数量。
如果包含右表中的字段(例如字段"manager"),则不会进行联接修剪,因为必须执行联接才能关联两个表中的记录。您还可以使用以下调试查询来测试这一点,该查询请求右表中的字段"manager":
从
"JOINCARDINALITY\u 1〃中选择
"salesord"、
"employee\u 1"、
"manager"、
"SUM"("amount")作为"amount"
化身示例.db.CVs●JoinNoEstimateCardinality"
GROUP BY
"salesOrder"、
"employee\u 1",
"manager"
当前调试阻止修剪
查看运行调试查询的结果显示"employees"没有变灰,这意味着它没有被修剪。
作为基数设置对连接修剪影响的进一步演示:将顺序基数设置为以下值:
–"n..1"–"1..n"–将其保留为空
在运行只转到左表的调试查询之前,不要忘记保存并构建计算视图:
从
"JOINCARDINALITY\u 1"中选择
"salesOrder"、
"employee\u 1"、
"SUM"("amount")作为"amount"
化身示例.db.CVs●JoinNoEstimateCardinality"
GROUP BY
"salesOrder",
"employee\u 1"
You"将看到修剪只发生在左外连接和"n..1"(或"1..1"之前)。如上所述,内部联接将阻止修剪。
类似地,对于右外部联接,只有"1..1"和"1..n"起作用。要检查此交换,请按下面突出显示的按钮:
交换左右表的按钮
并定义基数为"1..n"的右外部联接:
将执行右外部联接的定义
联接修剪。作为调试查询,您可以使用:
选择
"employee\u 1",
总和("金额")为
"金额"
来自
"联合基数1〃。"jo化身示例.db.CVs:JoinManualCardinalityRightOuter"
GROUP BY
"employee\u 1"
本节中的最后一个示例将显示请求的度量类型的影响:在连接前的示例中,只有在存在外部连接设置和要修剪的表的基数为"..1"。
如果在本例中仅请求count distinct度量值,则基数为"n..m"将允许进行修剪。原因是count distinct将删除任何潜在的重复项,而外部连接将保证不会丢失任何记录。总之,由于外部联接不会丢失任何记录,并且潜在的重复记录不会影响count distinct度量的结果,因此执行联接不会影响度量的值。因此,如果没有从要修剪的表请求任何字段,则可以省略连接。如果查询没有请求度量值,那么count distinct measures的作用也成立:显然,如果查询没有请求度量值,大数据问题,那么连接对未请求的度量值也不会产生任何影响,并且连接修剪也不会发生。
要看到这一点,在字段"employee\u 1"中将计算列定义为count distinct:
count distinct类型的计算列定义
将基数设置为"n..m":
基数定义"n..m
调试查询,仅请求左表的count distinct measure和字段将显示表修剪。例如,
选择
"员工1",
SUM("countDistinct")为"countDistinct"
来自
"JOINCARDINALITY\u 1〃。"jo化身示例.db.CVs用法:JoinEstimateCardinalityCountDistinct"
GROUP BY
"employee\u 1"
不要在调试视图中再次运行,让我们使用另一种方法来检查是否发生连接修剪:单击左侧的图标转到数据库资源管理器,
按钮要启动数据库资源管理器
打开一个SQL控制台,在那里输入调试查询并右击它以运行"分析SQL":
启动分析SQL
您将看到只使用了一个表:
在处理当前查询时只使用了一个表
这表明连接修剪也在基数设置为的情况下发生"n..m"当仅使用计数不同度量时。如果向查询中添加额外的度量值"amount",您将看到涉及两个表。这也可以通过当前未在数据库资源管理器中运行的解释计划进行检查,不过:
解释计划
选择
"员工1",
总和("countDistinct")作为"countDistinct",
总和("金额")为
"金额"
来自
"联合基数1〃。"jo化身示例.db.CVs*JoinEstimateCardinalityCountDistinct"
GROUP BY
"employee\u 1"
Explain Plan的输出
,因为您可以看到没有发生连接修剪,并且使用了这两个表。