我在SQL Server中有一个相当大的事实表,它由一个外键分区为日期维。外键约束已启用且受信任。当我在where子句中添加这样的东西时:
"F_ClinicInvoiceTransaction".ServiceDateKey>=40908 and "F_ClinicInvoiceTransaction".ServiceDateKey<42247
我得到分区消除。但是,当我只是加入ServiceDateKey并在日期范围内过滤时:
"D_Calendar"."CalendarKey" ="F_ClinicInvoiceTransaction"."ServiceDateKey"
AND "D_Calendar".StartDT>='2012-01-01' and "D_Calendar".StartDT<'2015-10-01'
分区消除消失了。有没有办法根据此连接获取分区,或者我是否明确地对事实表中的值进行过滤?
答案 0 :(得分:1)
当你提供更多细节时,回答这些问题真的要容易得多 - 但我会尽力回答:
使用您的第二个过滤器执行子查询(“D_Calendar”.StartDT&gt; ='2012-01-01'和“D_Calendar”.StartDT&lt;'2015-10-01')并获得Min和ServiceDateKey的最大值。
使用ServiceDateKey的最小值和最大值来执行完整查询,因为它具有最小值和最大值,可以执行分区消除。像第一个查询一样在where子句中使用这些值。
虽然看起来这两个步骤似乎会变慢,但通常情况下,分区消除会带来更快的结果。 ESP。大数据集。
答案 1 :(得分:0)
不,您无法通过过滤另一个表中的另一列来获取分区。它需要位于表中的实际分区列中,并且需要在where子句中进行文件化。在这里找到答案:https://dba.stackexchange.com/questions/21770