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

时间:2017-08-06 13:34:12

标签: sql-server data-warehouse datamart

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

例如

如果视图是

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服务器将外键标记为可信?

  3. e.g。

    的内容
    update sys.foreign_keys
    set is_not_trusted = 0
    

1 个答案:

答案 0 :(得分:0)

首先,您可能希望在架构中强制执行FK。如果需要,您可以禁用它们并在ETL的末尾检查它们,它们很有用。

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

所以替代方法是使用LEFT JOIN,然后只要DIM表在连接列上有唯一索引,SQL就知道连接不能改变结果的基数,并且会消除连接如果不引用维度列。例如:

<div class="container">
    <div class="bigbox">
      <div id="box4" class="box">
        <div id="box1" class="colorbox"></div>
        <div class="text">
          <input type="text" id="color1" class="shape" value="" size="12" maxlength="7" readonly="readonly" />
          <input type="text" id="color4" class="shape" value="" size="12" maxlength="7" readonly="readonly" />
          <input type="text" id="color7" class="shape" value="" size="12" maxlength="7" readonly="readonly" />
        </div>
      </div>
      <div id="box5" class="box">
        <div id="box2" class="colorbox"></div>
        <div class="text">
          <input type="text" id="color2" class="shape" value="" size="12" maxlength="15" readonly="readonly" />
          <input type="text" id="color5" class="shape" value="" size="12" maxlength="15" readonly="readonly" />
          <input type="text" id="color8" class="shape" value="" size="12" maxlength="15" readonly="readonly" />
        </div>
      </div>
      <div id="box6" class="box">
        <div id="box3" class="colorbox"></div>
        <div class="text">
          <input type="text" id="color3" class="shape" value="" size="12" maxlength="15" readonly="readonly" />
          <input type="text" id="color6" class="shape" value="" size="12" maxlength="15" readonly="readonly" />
          <input type="text" id="color9" class="shape" value="" size="12" maxlength="15" readonly="readonly" />
        </div>
      </div>
      <div class="buttonbox">
        <div class="arrowbox">
          <p>Yes, it's almost something what I'm looking for, but...Yeah you need some extra options - click "TEST" button below.</p>
          <div class="buttons">
            <button id="btnleft" class="arrowbutton">&#9668;</button>
            <button id="btncenter" class="testbutton">RESET</button>
            <button id="btnright" class="arrowbutton">&#9658;</button>
          </div>
        </div>
        <button id="btn1" onclick="colorChange();">Click for color !!!</button>
      </div>
    </div>
  </div>

输出

    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