未在 SQL 服务器的外键连接上进行分区消除
Not Getting Partition Elimination on a Foreign Key Join in SQL Server
我在 SQL 服务器中有一个相当大的事实 table,它由外键分区到日期维度。外键约束已启用且受信任。当我在 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'
分区消除消失了。有没有一种方法可以根据此连接消除分区,或者我是否坚持对事实 table 中的值进行显式过滤?
不,您不能通过过滤另一个 table 中的另一列来消除分区。它需要在 table 中的实际分区列上,并且需要在 where 子句中归档。在这里找到答案:https://dba.stackexchange.com/questions/21770
当你提供更多细节时,回答这些问题确实容易得多 -- 但我会尽力回答:
使用第二个过滤器执行子查询("D_Calendar".StartDT>='2012-01-01' 和 "D_Calendar".StartDT<'2015-10- 01' ) 并获取 ServiceDateKey 的最小值和最大值。
使用 ServiceDateKey 的最小值和最大值执行完整查询,现在它有最小值和最大值,它可以进行分区消除。像您的第一个查询一样在 where 子句中使用这些值。
虽然执行这两个步骤似乎会更慢,但通常情况下,分区消除会产生更快的结果。特别是大数据集。
我在 SQL 服务器中有一个相当大的事实 table,它由外键分区到日期维度。外键约束已启用且受信任。当我在 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'
分区消除消失了。有没有一种方法可以根据此连接消除分区,或者我是否坚持对事实 table 中的值进行显式过滤?
不,您不能通过过滤另一个 table 中的另一列来消除分区。它需要在 table 中的实际分区列上,并且需要在 where 子句中归档。在这里找到答案:https://dba.stackexchange.com/questions/21770
当你提供更多细节时,回答这些问题确实容易得多 -- 但我会尽力回答:
使用第二个过滤器执行子查询("D_Calendar".StartDT>='2012-01-01' 和 "D_Calendar".StartDT<'2015-10- 01' ) 并获取 ServiceDateKey 的最小值和最大值。
使用 ServiceDateKey 的最小值和最大值执行完整查询,现在它有最小值和最大值,它可以进行分区消除。像您的第一个查询一样在 where 子句中使用这些值。
虽然执行这两个步骤似乎会更慢,但通常情况下,分区消除会产生更快的结果。特别是大数据集。