日期:2014-05-19  浏览次数:20670 次

分区视图查询中分区排除的疑问
现有两个表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!
------解决方案--------------------
顶!!