我正在尝试为它的维度创建一个事实的星型模式视图。
例如
如果视图是
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/
是否有更好的方法允许在视图中进行联接剔除?
有没有办法强制SQL服务器将外键标记为可信?
e.g。
的内容update sys.foreign_keys
set is_not_trusted = 0
答案 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">◄</button>
<button id="btncenter" class="testbutton">RESET</button>
<button id="btnright" class="arrowbutton">►</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