web-dev-qa-db-fra.com

SQL Server crée une table avec un index clusterisé sans clé primaire

Est-il possible de créer un index en cluster à partir d'une instruction create table dans SQL Server 2008 qui n'est pas une clé primaire? 

Cela concerne une table dans SQL Azure. Ce n'est donc pas une option pour moi de créer d'abord la table, puis de créer l'index en cluster sur la table.

Edit: Apparemment, c'était FluentMigrator qui causait mes problèmes, sa table de version ne disposant pas d'un index en cluster, il était donc erroné d'essayer de créer la table de version, pas ma table.

15
Chris Marisic

Oui, il est possible de créer un index en cluster qui n'est pas la clé primaire. Utilisez simplement un CREATE CLUSTERED INDEX statement.

CREATE TABLE dbo.myTable (
    myTableId int PRIMARY KEY NONCLUSTERED
    myColumn int NOT NULL
)

CREATE CLUSTERED INDEX myIndex ON dbo.myTable(myColumn)

Avant la version Azure SQL Database v12, vous deviez disposer d'un index en cluster avant de pouvoir insérer des données dans une table. À partir de Azure SQL Database v12 , les segments de mémoire (tables sans index en cluster) sont désormais pris en charge.

Si votre base de données a été créée avant juin 2016, voici les instructions pour la mise à niveau vers la version 12 .

39
Rob Boek
CREATE TABLE dbo.Table_1
    (
    Id int NOT NULL IDENTITY (1, 1) PRIMARY KEY NONCLUSTERED,
    SomeOtherUniqueColumn int NOT NULL CONSTRAINT Item4 UNIQUE CLUSTERED
)  ON [PRIMARY]

notez la spécification de non-cluster sur la clé primaire

Cela fonctionnera toujours.

CREATE TABLE dbo.Table_1
    (
    SomeOtherUniqueColumn int NOT NULL CONSTRAINT Item4 UNIQUE CLUSTERED
)  ON [PRIMARY]
7
Buildstarted

Le code ci-dessous est compatible avec Azure. Il crée une clé primaire non clusterisée et un index clusterisé dans une seule instruction create table. Cette syntaxe permet également de spécifier plusieurs colonnes dans votre clé.

CREATE TABLE MyTable (
    ID uniqueidentifier  NOT NULL,
    UserID uniqueidentifier  NOT NULL,
    EntryDate DATETIME NOT NULL,
    CONSTRAINT PK_MyPrimaryKey_Name PRIMARY KEY NONCLUSTERED (ID),
    CONSTRAINT UCI_MyClusteredIndexName UNIQUE CLUSTERED (UserID ASC,EntryDate ASC,ID ASC)
);

Pour modifier un index en cluster de tables, vous devez supprimer l'index en cluster, ce qui convertit la table en un tas, puis le nouvel index en cluster est appliqué. Étant donné qu'Azure ne prend pas en charge les segments de mémoire (tables sans index clusterisés), il est impossible de modifier l'index clusterisé sans supprimer la table et la recréer. Dans Azure, vous ne pouvez pas spécifier d'index en cluster ailleurs que dans l'instruction table create.

0
David Sopko