【问题标题】:Not Getting Partition Elimination on a Foreign Key Join in SQL Server没有在 SQL Server 中的外键连接上消除分区
【发布时间】:2015-07-14 01:47:32
【问题描述】:

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

分区消除消失了。有没有办法根据这个连接来消除分区,或者我是否坚持对事实表中的值进行显式过滤?

【问题讨论】:

  • 你的表分区在什么地方?有什么计划?数据模型?所有连接/where 谓词?
  • @NorbertvanNobelen ServiceDateKey

标签: sql-server tsql partitioning


【解决方案1】:

当您提供更多详细信息时,回答这些问题确实容易得多——但我会尽力回答:

  1. 使用您的第二个过滤器("D_Calendar".StartDT>='2012-01-01' 和 "D_Calendar".StartDT

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

虽然执行这两个步骤似乎会更慢,但通常情况下,分区消除会产生更快的结果。特别是。使用大数据集。

【讨论】:

  • 为此加入子查询确实让我消除了分区。感谢您的意见!
【解决方案2】:

不,您不能通过过滤另一个表中的另一个列来消除分区。它需要在表中的实际分区列上,并且需要在 where 子句中归档。在这里找到答案:https://dba.stackexchange.com/questions/21770

【讨论】:

  • 请查看我的答案以了解解决此问题的方法。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-03-10
  • 1970-01-01
  • 1970-01-01
  • 2013-08-25
  • 1970-01-01
  • 2017-02-10
相关资源
最近更新 更多