我正在尝试创建一个事实的星型模式视图。
例如。
如果视图是
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服务器将外键标记为受信任?
例如,类似
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.