资源描述:
《sqlserver分区视图》由会员上传分享,免费在线阅读,更多相关内容在工程资料-天天文库。
1、SQLServer分区视图2011-05-1720:58SQLServer分区视图 在数据库中,对于一些长年累月不断递增的表,难免会发生执行速度越来越慢的问题。做分区表,是一种解决办法。“:>>>>>>假如条件不允许做分区表的话,例如:当你创建一个分区函数的时候,系统提示你:只能在SQLServerEnterpriseEdition中创建分区函数。只有SQLServerEnterpriseEdition支持分区。那么分区表,是没法用了,只能想别的办法了。 情况一或者是数据库里面的一张大表,已经按时间,拆分为多个小表了。但是客户要求软件里面,查询数据,要和没拆分之前一样。例如:原先的
2、sale_data包含2008年--今天的数据。现在的sale_data被拆分为sale_data_2008,sale_data_2009,sale_data_2010,sale_data(这个仅保存2011年数据)也就是假如客户要查询2009年12月-2010年1月的报表。不好意思,你要自己判断了。先判断时间2009年12月,然后去检索sale_data_2009表的部分数据接着再判断时间2010年1月,然后去检索sale_data_2010表的部分数据. 情况二或者是数据库本身就被设计成多张小表。例如:有个仓库字典表记录着仓库的名字,仓库的表名。表里面的数据可能是大仓库1 ta
3、b_big1大仓库2 tab_big2小仓库1 tab_small小仓库2 tab_small小仓库3 tab_small有很多个仓库表(表名就是仓库字典表中所定义的),记录着当前仓库存储着什么物品。当你要查询某个仓库的库存报表的时候。不好意思,你要先去仓库字典表,先查询出这个仓库名字所对应的数据库表名称叫啥。然后再SELECT*FROM表名。如果你要查询,现在这个时候,某样物品,都在哪些仓库有,各有多少个,那就更悲惨了。要DISTINCT仓库字典表中的表名,然后依次去检索每个仓库的数据。普通的视图,可以解决上面的多次检索表的问题。但是性能上恐怕不能接受。看了一下SQLServer
4、的分区视图,主要是要求,创建视图中的每个表,需要有一个独立的约束信息。让数据库引擎能够在查询的时候,知道哪些表,是可以忽略的。从而避免不必要的查询开销。 例子一下面首先是那个2008--今天的销售数据的例子: 注意,下面表定义中的Check是分区视图所必须的。如果没有Check约束,那么最后的视图,就仅仅是普通的视图。--2008年数据.CREATETABLEsale_data_2008( sale_date DATETIMENOTNULL, sale_item VARCHAR(2)NOTNULL, sale_moneyDECIMAL(10,2)NOTNULL, CHECK(sa
5、le_date>='2008-01-0100:00:00' ANDsale_date<'2009-01-0100:00:00'), PRIMARYKEY(sale_date,sale_item));GO--2009年数据.CREATETABLEsale_data_2009( sale_date DATETIMENOTNULL, sale_item VARCHAR(2)NOTNULL, sale_moneyDECIMAL(10,2)NOTNULL, CHECK(sale_date>='2009-01-0100:00:00' ANDsale_date<'20
6、10-01-0100:00:00'), PRIMARYKEY(sale_date,sale_item));GO--2010年数据.CREATETABLEsale_data_2010( sale_date DATETIMENOTNULL, sale_item VARCHAR(2)NOTNULL, sale_moneyDECIMAL(10,2)NOTNULL, CHECK(sale_date>='2010-01-0100:00:00' ANDsale_date<'2011-01-0100:00:00'), PRIMARYKEY(sale_date,sale_item));
7、GO--当前数据.CREATETABLEsale_data( sale_date DATETIMENOTNULL, sale_item VARCHAR(2)NOTNULL, sale_moneyDECIMAL(10,2)NOTNULL, CHECK(sale_date>='2011-01-0100:00:00' ANDsale_date<'2012-01-0100:00:00'), PRIMARYKEY(sale_date,sale_item));GO