Verschieben der Primärschlüsseleinschränkung von einem Index in einen anderen

7

Ich habe eine SQL Server-Datenbank und bin dagegen gelaufen sp_blitz. Dies ergab, dass sich auf Tabellen mittlerer Größe einige Haufen befinden (in einem Fall einige hunderttausend Zeilen).

Die meisten dieser Tabellen haben einen Primärschlüssel (einer nicht, aber darauf werde ich später eingehen). Der Primärschlüssel selbst hat einen ungewöhnlichen Namen - dh nicht den Standardnamen, wenn die meisten Tabellen einen Standardprimärschlüsselnamen haben ( PK_tablename).

Es gibt einen Index mit einem Namen, der mit dem Primärschlüssel übereinstimmt, der eindeutig und nicht gruppiert ist.

Ich kann den Primärschlüssel umbenennen, denke dann aber, ich sollte einen Clustered-Index erstellen. Wenn ich das mache, habe ich doppelte Indizes, daher wäre es sinnvoll, den nicht gruppierten Index zu entfernen. Es wird jedoch für den Primärschlüssel verwendet.

Wenn ich die Primärschlüsseleinschränkung vom alten nicht gruppierten Index in den neuen gruppierten Index verschiebe:

  1. Macht das Sinn?
  2. Gibt es Dinge, die ich beachten sollte?
  3. Was ist die beste Methode, um dies zu tun?
hmallett
quelle

Antworten:

14

Das folgende Skript zeigt eine effiziente Möglichkeit, den vorhandenen nicht gruppierten Primärschlüssel in einen Cluster zu konvertieren und ihn umzubenennen:

-- How the table looks now
CREATE TABLE dbo.Example
(
    pk integer NOT NULL,
    some_data integer NOT NULL,

    CONSTRAINT PK_UnusualName
        PRIMARY KEY NONCLUSTERED (pk)
);

-- Some data
INSERT dbo.Example (pk, some_data)
VALUES (1, 100), (2, 200), (3, 300);

-- Change the nonclustered PK to clustered
CREATE UNIQUE CLUSTERED INDEX PK_UnusualName
ON dbo.Example (pk)
WITH (DROP_EXISTING = ON);

-- Rename
EXECUTE sys.sp_rename 
    @objname = N'dbo.Example.PK_UnusualName',
    @newname = N'PK__dbo_Example_pk',
    @objtype = 'INDEX';

-- Tidy up
DROP TABLE dbo.Example;
Paul White 9
quelle