SQL Server中的外键加入没有取消分区

时间:2015-07-11 03:56:11

标签: sql-server tsql partitioning

我在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' 

分区消除消失了。有没有办法根据此连接获取分区,或者我是否明确地对事实表中的值进行过滤?

2 个答案:

答案 0 :(得分:1)

当你提供更多细节时,回答这些问题真的要容易得多 - 但我会尽力回答:

  1. 使用您的第二个过滤器执行子查询(“D_Calendar”.StartDT&gt; ='2012-01-01'和“D_Calendar”.StartDT&lt;'2015-10-01')并获得Min和ServiceDateKey的最大值。

  2. 使用ServiceDateKey的最小值和最大值来执行完整查询,因为它具有最小值和最大值,可以执行分区消除。像第一个查询一样在where子句中使用这些值。

  3. 虽然看起来这两个步骤似乎会变慢,但通常情况下,分区消除会带来更快的结果。 ESP。大数据集。

答案 1 :(得分:0)

不,您无法通过过滤另一个表中的另一列来获取分区。它需要位于表中的实际分区列中,并且需要在where子句中进行文件化。在这里找到答案:https://dba.stackexchange.com/questions/21770