关于分区视图及查询优化的问题

webmoon 2003-04-02 03:05:32
大量的历史数据(几百万行),其中一列为会计期间PeriodID char(6), yyyymm格式,该数据经常被用来做查询,生成报表,由于行数太多,消耗时间也多,因此考虑作水平分区,每年一张表:
tb2000, tb2001, ... , tb2003
每张表各自在periodID上做了约束,如tb2001,check(left(PeriodID,4)='2001')
然后
create view viewTb as
select * from tb2000
union all
select * from tb2001
....
由于条件所制,拆开的表实际上还放在同一个服务器的同一个MDB里,没有分开到几个盘或几个服务器上去。

我希望是达到这样的效果,在写查询语句的时候统一都是对viewTB进行,但如果条件中有left(PeriodID,4)='2001'时,系统能根据这个条件自动判断出应该只对tb2001进行SCAN,从而达到提高效率的目的,但我现在不太确定,我现在这样做是不是能够达到这一目的,或者我应该怎么做才行。
另外,如果我要对某一会计期间(如200109)的数据进行查询,那查询条件是不是一定要这样写:
left(PeriodID,4)='2001' and right(periodID,2)='09'
直接写periodID='200109',系统有那么聪明吗?

谢谢!
...全文
23 点赞 收藏 6
写回复
6 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
webmoon 2003-04-03
谢谢,本贴先结,不过能不能麻烦各位写得更详细一点,我再开一个百分贴
回复
pengdali 2003-04-02
1、
每张表各自在periodID上做了约束,如tb2001,check(left(PeriodID,4)='2001')
==>再加一列:
如:tb2001,tempid default 2001
把它设为主键的一部分

2、例:你的表对 tempid和id做了主键,你建立了分区视图MyView你用下列查询:
select * from MyView where 一个非主键列='XX' --在按CTRL+L看执行计划
select * from MyView where tempid=2001 ---在按CTRL+L看执行计划
select * from MyView where tempid=2001 and id=1234567898 ---在按CTRL+L看执行计划

你就会看到明显的差距
回复
zqllyh 2003-04-02
不要借用这个视图,这个视图连了这么多表,一定会慢,当left(PeriodID,4)='2001'时,事实上数据只在tb2001上,采用动态SQL语句,如:
declare @aa varchar(20),@sql varchar(8000)
set @aa = 'tb2001'
set @sql = 'select * from ' + @aa
exec(@sql)
回复
pengdali 2003-04-02
你要速度,还是冗余?
回复
leimin 2003-04-02
1.建立INDEX VIEW(CLUSTERED INDEX).
2.建立SP动态在VIEW中检索数据,通过对LOCK的控制,提高INDEX的速度。
select * from testview (nolock)
3.检索是指定索引:
select * from testview(index=1)


good luck!

回复
webmoon 2003-04-02
这个tempid岂不是很冗余?
回复
相关推荐
发帖
疑难问题
创建于2007-09-28

2.1w+

社区成员

MS-SQL Server 疑难问题
申请成为版主
帖子事件
创建了帖子
2003-04-02 03:05
社区公告
暂无公告