强制可信外键 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/
是否有更好的方法允许在视图中加入剔除?
有没有办法强制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.
我正在尝试创建事实的星型模式视图。
例如
如果视图是
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 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.