日期:2014-05-18  浏览次数:20452 次

关于对分区视图的困惑?
建立两个表,   约束列a2,   一个> 10,一个 <10,   然后建立分区视图,   但执行

SET   STATISTICS   IO   on
select   *   from   v1   where   a2     =6
SET   STATISTICS   IO   off
后,得到
表   't2 '。扫描计数   1,逻辑读   2   次,物理读   0   次,预读   0   次。
表   't1 '。扫描计数   1,逻辑读   2   次,物理读   0   次,预读   0   次。

为什么还会对两个表都进行扫描,   求解?  
-----------------------
建表和视图脚本:
CREATE   TABLE   [dbo].[t1]   (
[a1]   [int]   NOT   NULL   ,
[a2]   [int]   NOT   NULL  
)   ON   [PRIMARY]
GO

CREATE   TABLE   [dbo].[t2]   (
[a1]   [int]   NOT   NULL   ,
[a2]   [int]   NOT   NULL  
)   ON   [PRIMARY]
GO

ALTER   TABLE   [dbo].[t1]   WITH   NOCHECK   ADD  
CONSTRAINT   [PK_t1]   PRIMARY   KEY     CLUSTERED  
(
[a1],
[a2]
)     ON   [PRIMARY]   ,
CONSTRAINT   [CK_a1]   CHECK   ([a2]   <   10)
GO

ALTER   TABLE   [dbo].[t2]   WITH   NOCHECK   ADD  
CONSTRAINT   [PK_a2]   PRIMARY   KEY     CLUSTERED  
(
[a1],
[a2]
)     ON   [PRIMARY]   ,
CONSTRAINT   [CK_a2]   CHECK   ([a2]   >   10)
GO

create   view   v1   as

select   a1,   a2   from   t1
union   all
select   a1,   a2   from   t2


------解决方案--------------------
CREATE TABLE t1 (
[a1] [int] NOT NULL primary key,
[a2] [int] NOT NULL check (a2 <10)
)
GO
CREATE TABLE t2 (
[a1] [int] NOT NULL primary key,
[a2] [int] NOT NULL check (a2> 10)
)
GO

create view v1 as
select a1, a2 from t1
union all
select a1, a2 from t2

go
select * from v1 where a2=6 --仅扫描t1

go
drop view v1
drop table t1
drop table t2
------解决方案--------------------
搞错,抱歉!是分区视图。结果应该是:

表 't2 '。扫描计数 1,逻辑读 0 次,物理读 0 次,预读 0 次。
表 't1 '。扫描计数 1,逻辑读 2 次,物理读 0 次,预读 0 次。

楼主笔误了吧。

扫描计数 1,应该是扫描表约束,并不是扫描表数据页,因为:逻辑读 0 次,物理读 0 次,预读 0 次。

正确的。
------解决方案--------------------
表 't2 '。扫描计数 0,逻辑读 0 次,物理读 0 次,预读 0 次。
表 't1 '。扫描计数 1,逻辑读 0 次,物理读 0 次,预读 0 次。