强制受信任的外键 SQL Server 允许在视图中进行联接剔除



我正在尝试创建一个事实的星型模式视图。

例如。

如果视图是

Select  
_fact.A, _Dim.B
from 
_fact
inner join 
_dim on _Fact.dim_sk = _dim.Dim_sk

我查询

Select _Fact.A 
from _view

它将忽略_dim中的联接。

执行此操作的一种方法是创建维度的受信任外键。 但是,这意味着我必须创建并启用检查约束,这会减慢我的插入速度。

https://www.brentozar.com/archive/2015/05/do-foreign-keys-matter-for-insert-speed/

  1. 有没有更好的方法来允许在视图中进行联接剔除?

  2. 有没有办法强制SQL服务器将外键标记为受信任?

例如,类似

update sys.foreign_keys
set is_not_trusted = 0

首先,您可能确实希望在架构中使用强制 FK。 如果需要,您可以禁用它们并在 ETL 结束时检查它们,它们很有用。

但是,在某种规模下,您希望将 FK 保留为 NOCHECK 以提高性能。

因此,另一种方法是使用 LEFT JOIN,然后只要 DIM 表在连接列上具有唯一索引,SQL 就知道连接无法更改结果的基数,如果不引用维度列,则会消除连接。 例如:

use tempdb
go
drop table if exists _fact 
drop table if exists _dim
go
create table _dim(Dim_sk int primary key, B int)
create table _fact( A int, dim_sk int references _dim)
go
create or alter view _view
as
Select  
_fact.A, _Dim.B
from 
_fact
left join 
_dim on _Fact.dim_sk = _dim.Dim_sk
go
set statistics io on
go
Select A 
from _view
go
set statistics io off

输出

Table '_fact'. Scan count 1, logical reads 0, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.

最新更新