读书人

关于对分区视图的困惑?该怎么解决

发布时间: 2012-01-15 22:57:49 作者: rapoo

关于对分区视图的困惑?
建立两个表, 约束列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 次。

读书人网 >SQL Server

热点推荐