1
以下是測試表和分區視圖。分區視圖執行計劃
use tempdb
go
SET STATISTICS IO ON
create table T1 (C int primary key);
create table T2 (C int primary key);
create table T3 (C int primary key);
create table T4 (C int primary key);
create table T5 (C int primary key);
create table T6 (C int primary key);
create table TA (c int primary key, id int);
insert into dbo.T1(C) values (1),(2),(3),(4),(5),(6),(7),(8)
insert into dbo.T2(C) values (1),(2),(3),(4),(5),(6),(7),(8)
insert into dbo.T3(C) values (1),(2),(3),(4),(5),(6),(7),(8)
insert into dbo.T4(C) values (1),(2),(3),(4),(5),(6),(7),(8)
insert into dbo.T5(C) values (1),(2),(3),(4),(5),(6),(7),(8)
insert into dbo.T6(C) values (1),(2),(3),(4),(5),(6),(7),(8)
insert into TA values (1, 1), (2, 2)
go
create view V(Id, C)
as
select 1, * from T1 union all
select 2, * from T2 union all
select 3, * from T3 union all
select 4, * from T4 union all
select 5, * from T5 union all
select 6, * from T6
但是,下面的視圖將掃描所有的表?什麼是避免它的最好方法?
SELECT * FROM dbo.V join TA on TA.c = v.c
where ta.c = 2 and ta.id = v.id
option (recompile)
由於原來的結果進行比較。應該'外部申請'交叉申請'所以它的語義上等於原來的SQL?但是,交叉應用將掃描所有的表格。 – ca9163d9
@ dc7a9163d9 - 是'CROSS APPLY'和'OUTER APPLY'在這種情況下在語義上是相同的,但看起來'CROSS APPLY'只是在您開始使用時轉換爲相同的'INNER JOIN'計劃。 –
我發現如果在使用'cross apply'的時候添加'CA.c不爲空',它會掃描所有的表格。 – ca9163d9