0

このようなテーブルを作成すると

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_constraints1つずつ作成し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]

は0nameに設定されてNULLいます。しかし、その行で行ったように、これを削除してみませんか?index_idsys.key_constraint

4

1 に答える 1

3

主キーの制約は、クラスター化インデックスによって強制されます。制約を削除すると、クラスター化されたインデックスも削除され、ヒープがそのまま残ります。ヒープには、次の独自のエントリがありsys.indexesます。

インデックスのタイプ:
0=ヒープ
1=クラスター化
2=非クラスター化

于 2013-03-07T11:23:20.843 に答える