分区视图查询中分区排除的疑问
现有两个表april1998sales和May1998sales两个表,
结构均为
orderid int 4,
customerid int 4,
orderdate datetime 8,
ordermonth int 4,
deliverydate datetime 8,
主键为 orderid,ordermonth
约束分别为
april1998sales CHECK (datepart(month,[DeliveryDate]) = 4)
april1998sales CHECK ([OrderMonth] = 4)
april1998sales CHECK (datepart(year,[OrderDate]) = 1998
和
april1998sales CHECK (datepart(month,[DeliveryDate]) = 5)
april1998sales CHECK ([OrderMonth] = 5)
april1998sales CHECK (datepart(year,[OrderDate]) = 1998
分区视图为
SELECT * FROM April1998sales
UNION ALL
SELECT * FROM May1998sales
查询
SET STATISTICS IO on
select * from test_view where ordermonth=5
表 'May1998sales '。扫描计数 1,逻辑读 2 次,物理读 0 次,预读 0 次。
表 'april1998sales '。扫描计数 0,逻辑读 0 次,物理读 0 次,预读 0 次。
可以分区排除
但查询
SET STATISTICS IO on
select * from test_view where orderdate> = '19980501 ' and orderdate < '19980531 '
表 'May1998sales '。扫描计数 1,逻辑读 2 次,物理读 0 次,预读 0 次。
表 'april1998sales '。扫描计数 1,逻辑读 2 次,物理读 0 次,预读 0 次。
不能分区排除,
不知道是何原因??????
------解决方案--------------------分区视图尽量用竹键查询
其他字段查询会造成不必要的扫描
------解决方案--------------------而且你没限定orderdate> = '19980501 ' and orderdate < '19980531 '
的记录一定在May1998sales
------解决方案--------------------加个check (datepart(month,[orderDate]) = 5)
试试,估计不行
------解决方案--------------------在orderDate日期上增加约束,指定分区表的日期范围,使得分区视图能够按日期区分记录范围,进行分区排除:
alter table april1998sales add constraint check_april3 check([OrderDate] between '19980401 ' and '19980430 ')
alter table may1998sales add constraint check_may3 check([OrderDate] between '19980501 ' and '19980531 ')
------解决方案--------------------mark!
------解决方案--------------------顶!!