日期:2014-05-18  浏览次数:20401 次

建立sql server2000分区视图失败
建表存储过程
CREATE   PROCEDURE   CreateLogTable   @strID   varchar
AS
declare   @strSQL   nvarchar(256)
set  
@strSQL= 'Create   Table   UserLog '   +@strID+
'(   LogID   bigint,
  [log]   varchar(200),
  UserID   int,
  APID   int   PRIMARY   KEY(apid,logid)   check   (APID= '+@strID+ '),
  [Date]   datetime)
'
print   @strSQL
exec   sp_executeSQL   @strSQL
GO

然后建了两个表,UserLog1,UserLog2

分区视图:
create   view   userlog   as
SELECT   *
FROM   UserLog1   union   all   select   *   from   Userlog2  

查询:
select   *   from   userlog   where   apid=1

查询计划显示两个表个占查询成本的50%,也就是分区视图没有起作用。但是如果用细下面的查询语句:
select   *   from   userlog   where   apid=1   and   LogID=1
就显示只查了一个表,查询优化成功。

这到底是为什么啊,分区键不是只要是主键的一部分就可以了吗。请高手解惑,谢谢。(分不多,请大家多多包涵了)

------解决方案--------------------
其实你建的分区视图没有错,联合主键也没有错,错在查询了.
分区视图在查询的时候要求查询的值与分区列的类型相同,而你在查询where apid=1时,SQLSERVER会将1视为tinyint,但apid的类型却为int,因此数据类型不对,导致分区失效,进行全区扫描.
这样处理一下,把分区列的查询值显示转换为分区列的数据类型,例如:
select * from userlog where apid = CAST(1 as int) /*将1强制转换为分区列的数据类型*/