2013-06-25 27 views
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) 

回答

1

該重寫將啓動謂詞的過濾器添加到計劃中,並避免訪問其他表。

SELECT * 
FROM TA 
     OUTER APPLY (SELECT * 
        FROM dbo.V 
        WHERE TA.c = v.c 
          AND ta.id = v.id) CA 
WHERE TA.c = 2 

STATISTICS IO結果

Table 'Worktable'. Scan count 0, logical reads 0, physical reads 0 
Table 'T2'. Scan count 0, logical reads 2, physical reads 0 
Table 'TA'. Scan count 0, logical reads 2, physical reads 0 

Table 'T6'. Scan count 0, logical reads 2, physical reads 0 
Table 'T5'. Scan count 0, logical reads 2, physical reads 0 
Table 'T4'. Scan count 0, logical reads 2, physical reads 0 
Table 'T3'. Scan count 0, logical reads 2, physical reads 0 
Table 'T2'. Scan count 0, logical reads 2, physical reads 0 
Table 'T1'. Scan count 0, logical reads 2, physical reads 0 
Table 'TA'. Scan count 0, logical reads 2, physical reads 0 
+0

由於原來的結果進行比較。應該'外部申請'交叉申請'所以它的語義上等於原來的SQL?但是,交叉應用將掃描所有的表格。 – ca9163d9

+0

@ dc7a9163d9 - 是'CROSS APPLY'和'OUTER APPLY'在這種情況下在語義上是相同的,但看起來'CROSS APPLY'只是在您開始使用時轉換爲相同的'INNER JOIN'計劃。 –

+0

我發現如果在使用'cross apply'的時候添加'CA.c不爲空',它會掃描所有的表格。 – ca9163d9