其实还有一张表,情况也是类似的:时间类型的聚集索引和一个一列的非聚集索引,出现同样的问题 删除非聚集索引之后就没有问题了CREATE NONCLUSTERED INDEX [IX_XXXX_xid] ON [dbo].[XXXX] ( [xid] ASC )WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, SORT_IN_TEMPDB = OFF, IGNORE_DUP_KEY = OFF, DROP_EXISTING = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] GO
有点诡异,我这里怎么没出问题?CREATE TABLE test ([datetime] DATETIME ,id INT ) CREATE CLUSTERED INDEX a ON test ([datetime]) CREATE nonCLUSTERED INDEX b ON test (id) INSERT INTO test VALUES(GETDATE(),1),(GETDATE(),1)/* (2 row(s) affected) */
刚又试了连续插入100万数据,都没报错CREATE TABLE test ([datetime] DATETIME ,id INT ) CREATE CLUSTERED INDEX a ON test ([datetime]) CREATE nonCLUSTERED INDEX b ON test (id) INSERT INTO test VALUES(GETDATE(),1) go 1000000 SELECT COUNT(1) FROM test /* 1000002 */
哦,是在插入数据时报的这个错误是吗?你运行一下这个代码,把结果贴出来看看: select --t.name, i.name, i.type_desc,is_unique, is_primary_key, is_unique_constraint from sys.tables t inner join sys.indexes i on t.object_id = i.object_id where t.name = '你的表'
对不住大家,我好像忽略了一个重要信息,是在处理分区的时候出的错,插入没问题 ALTER PARTITION FUNCTION fNowdate() merge RANGE (@day1) ALTER PARTITION SCHEME schNowdate NEXT USED [PRIMARY]; ALTER PARTITION FUNCTION fNowdate() split RANGE (@day2) 感谢大家的回复
其他的表有用这个分区函数,不过他们的数据较少,而且设置也和这个表是一样的 错误就提示的是这张表的索引,删除这个索引后处理分区就没问题了哦,估计是这个CREATE nonCLUSTERED INDEX b ON test (id)索引导致的。因为这个非聚集索引,不包含分区列,一旦你的分区合并,就会导致,这个索引无效,所以你删除了这个分区后,就好了
没有主键,只有以datetime列的聚集索引
删除非聚集索引之后就没有问题了CREATE NONCLUSTERED INDEX [IX_XXXX_xid] ON [dbo].[XXXX]
(
[xid] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, SORT_IN_TEMPDB = OFF, IGNORE_DUP_KEY = OFF, DROP_EXISTING = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
GO
CREATE CLUSTERED INDEX a ON test ([datetime])
CREATE nonCLUSTERED INDEX b ON test (id)
INSERT INTO test
VALUES(GETDATE(),1),(GETDATE(),1)/*
(2 row(s) affected)
*/
CREATE CLUSTERED INDEX a ON test ([datetime])
CREATE nonCLUSTERED INDEX b ON test (id)
INSERT INTO test
VALUES(GETDATE(),1)
go 1000000
SELECT COUNT(1) FROM test
/*
1000002
*/
select --t.name,
i.name,
i.type_desc,is_unique,
is_primary_key,
is_unique_constraint
from sys.tables t
inner join sys.indexes i
on t.object_id = i.object_id
where t.name = '你的表'
对不住大家,我好像忽略了一个重要信息,是在处理分区的时候出的错,插入没问题
ALTER PARTITION FUNCTION fNowdate() merge RANGE (@day1)
ALTER PARTITION SCHEME schNowdate NEXT USED [PRIMARY];
ALTER PARTITION FUNCTION fNowdate() split RANGE (@day2)
感谢大家的回复
你的意思是,在执行这个语句是报了上面的错误是把。那应该是在merge合并分区时,导致的这个问题,但是你说你没建唯一索引,照理是不会有这个问题的把
IX_Test_sid NONCLUSTERED 0 0 0
--其中sid为char型
IX_Test_sid NONCLUSTERED 0 0 0
--其中sid为char型
这个输出,确实说明,这个表,没有建立唯一索引,也没有主键。对了,会不会还有其他的表用这个 分区函数呢,导致了你运行这个分区函数,另外,其他用这个分区函数的分区表,报错了?
错误就提示的是这张表的索引,删除这个索引后处理分区就没问题了哦,估计是这个CREATE nonCLUSTERED INDEX b ON test (id)索引导致的。因为这个非聚集索引,不包含分区列,一旦你的分区合并,就会导致,这个索引无效,所以你删除了这个分区后,就好了
你的意思是我把日期列加上建个组合索引就没问题吗其实如果你把聚集索引的列放到非聚集索引时,实际上还是只有一列,因为sqlserver不会重复存储列,但是你试一下也无妨
你的意思是我把日期列加上建个组合索引就没问题吗对了这样呢:
CREATE NONCLUSTERED INDEX [IX_XXXX_xid] ON [dbo].[XXXX]
(
[xid] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, SORT_IN_TEMPDB = OFF, IGNORE_DUP_KEY = OFF, DROP_EXISTING = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON)
ON schNowdate(你的分区字段)