0

我正在尝试根据其维度创建事实的星型模式视图。

例如。

如果视图是

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
4

1 回答 1

0

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

但是,在某种程度上,您希望将 FK 保留为 NOCHECK 以提高性能。

所以另一种选择是使用LEFT JOIN,然后只要DIM表在join列上有唯一索引,SQL就知道join不能改变结果的基数,如果不这样做就会消除join t 引用维度列。例如:

    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.
于 2017-08-06T15:42:46.667 回答