Donnerstag, 26. Mai 2011

PRIMARY KEY-Einschränkungen mit einem NONCLUSTERED INDEX finden

In der Regel verfügt eine Tabelle über PRIMARY KEY-Einschränkung, für die ein gruppierter Index standardmäßig erstellt wird. Man kann auch eine PK-Einschränkung mit einem nicht gruppierten Index erstellen. Als ein Beispiel dafür siehe Abfrage 3.
Sind die Richtlinien für den Entwurf gruppierter Indizes angehalten, ist der Index eine gute Grundlage für die Erstellung von weiteren Indizes und so für eine schnellere Datenbank.
Entwickelt oder optimiert man eine große Datenbank, kann es passieren, dass gruppierte Indizes für eine ungünstige Spalte oder Spaltenkombination erstellt werden. Besonders teuer für Abfragen können die Tabellen mit einer PRIMARY KEY-Einschränkung sein, für die ein nicht gruppierter Index oder ein gruppierter Index für die Spalten, die nicht in die PK eingeschlossen sind, erstellt wurde. Deswegen sollte man die Tabellen genauer anschauen.
Um einen Überblick über die PRIMARY KEY-Einschränkungen mit einem nicht gruppierten Index  in einer großen Datenbank zu bekommen, habe ich die folgenden zwei Abfragen geschrieben.
Abfrage 1. Bezeichnet Tabellennamen mit 1, die einen gruppierten Index besitzen
select
    name as TableName,
    objectproperty(t.object_id,'TableHasClustIndex')
        as HasClustIndex
from
    sys.tables t
go
Abfrage 2. Bezeichnet PK-Einschränkungen mit 1, für die ein gruppierter Index erstellt wurde
select
    quotename(schema_name(k.schema_id)) + '.' +
    quotename(object_name(k.parent_object_id)) as TableName,
    k.name as PrimaryKey,
    objectproperty(k.[object_id],'CnstIsClustKey') as IsClustKey
from
    sys.key_constraints k
where
    k.[type] = 'PK'
order by
    k.schema_id ,k.parent_object_id
go
Abfrage 3. Erstellt die PK-Einschränkung [PK_MyTable] für die Tabelle [MyTable] mit einem nicht gruppierten Index
create table dbo.MyTable
(
    MyTableID int identity,
    Column1 nvarchar(55),
    constraint PK_MyTable primary key nonclustered
    (
        MyTableID
    )
)
go

oder

create table dbo.MyTable
(
 MyTableID int identity constraint PK_MyTable primary key nonclustered,
 Column1 nvarchar(55)
)
go
Verwandte Links:

Keine Kommentare:

Kommentar veröffentlichen