2013-03-07 85 views
0

当我创建一个表像这样为什么SQL Server不会删除更新索引而不是更新它们?

CREATE TABLE Test 
(TestId INT IDENTITY(1,1) NOT NULL, 
FName VARCHAR(255) NOT NULL, 
LName VARCHAR(255) NOT NULL, 
CONSTRAINT PK_TestID PRIMARY KEY(TestId)) 

SQL Server创建相关的主键,一个在sys.key_constraints,一个在sys.indexes。从运行下面的查询可以看出,在创建表之前和之后。

SELECT Count(*) 
FROM 
    sys.key_constraints 

SELECT Count(*) 
FROM 
    sys.indexes 
WHERE 
    object_id IN (SELECT object_id 
        FROM 
         sys.objects 
        WHERE 
         type_desc = 'USER_TABLE') 

它也使用它们。

当我跑这

INSERT INTO test 
VALUES 
    ('Me', 'You') 

执行规划显示Clustered Index Insert

但是当我删除约束

ALTER TABLE Test 
DROP CONSTRAINT PK_TestID 
GO 

然后跑到上面2个查询的查询,该sys.key_constraints有1个算少那么它有什么,如果这正是它应该是。但是,sys.indexes仍然具有相同的数,但是当我运行这个

SELECT * 
FROM 
    sys.indexes 
WHERE 
    object_id IN (SELECT object_id 
        FROM 
         sys.objects 
        WHERE 
         type_desc = 'USER_TABLE') 
    AND 
    object_id = object_id(N'Test') 
ORDER BY 
    [name] 

name设置为NULLindex_id为0。但是,为什么不只是删除这就像我们在sys.key_constraint该行做?

回答

3

您的主键约束恰好由聚簇索引强制执行。当您放弃约束条件时,还会丢弃聚簇索引,并保留heap。堆具有sys.indexes其自己的条目:

索引类型:
0 =堆
1 =群集
2 =非聚集