强制可信外键 SQL 服务器允许在视图中加入剔除

Force trusted foreign key SQL Server to allow join culling in view

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

例如

如果视图是

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 table 在连接列上有唯一索引,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.