Sql Server créer des requêtes de table

J'utilise Sql Server Migration assistant pour migrer ma database de MySql vers SQL Server et dans le process d'apprentissage Sql Server.

Voici la syntaxe create table pour le schéma autogénéré.

CREATE TABLE [dbo].[TABLE1] ( [COLUMN1] BIGINT IDENTITY (131556, 1) NOT NULL, [COLUMN2] INT CONSTRAINT [DF__TABLE_1__PRD_I__24E777C3] DEFAULT ((0)) NULL, [COLUMN3] INT CONSTRAINT [DF__TABLE1__PROMO__2AA05119] DEFAULT ((0)) NULL, CONSTRAINT [PK_TABLE1] PRIMARY KEY CLUSTERED ([COLUMN1] ASC) ); GO CREATE NONCLUSTERED INDEX [COLUMN3] ON [dbo].[TABLE1]([COLUMN3] ASC); GO EXECUTE sp_addextendedproperty @name = N'MS_SSMA_SOURCE', @value = N'TABLE1', @level0type = N'SCHEMA', @level0name = N'dbo', @level1type = N'TABLE', @level1name = N'TABLE1'; 

J'essaie de comprendre et de nettoyer le schéma. Peut-on aider quelqu'un avec les questions suivantes (naïves)?

  1. Pourquoi la key primaire (COLUMN1) doit-elle être spécifiée comme PRIMARY KEY CLUSTERED ?
  2. Dans la table MySql d'origine, COLUMN3 est indexé. L'INDEX NONCLUSTER est-il l'équivalent de Sql Server? Quel est le sens de

    CREATE INDEX NON CLUSTERED [COLUMN3] ON [dbo]. [TABLE1] ([COLUMN3] ASC);

  3. Je n'ai pas compris ce qui suit:

    EXECUTE sp_addextendedproperty @name = N'MS_SSMA_SOURCE ', @value = N'TABLE1', @ niveau0type = N'SCHEMA ', @ niveau0nom = N'dbo', @ niveau1type = N'TABLE ', @ niveau1nom = N'TABLE1';

    Quelqu'un peut-il expliquer ce qu'il fait?

  4. Est-ce que la syntaxe minimale de la table est la syntaxe minimale pour accomplir ce qu'elle fait?
  5. J'ai 131555 lignes dans ma table MySql. Dois-je spécifier IDENTITY (131556, 1) pour démarrer l'incrémentation automatique de la key à partir de 131556 après la migration des données?

1.Pourquoi la key primaire (COLUMN1) doit-elle être spécifiée comme "CLAVIER PRIMAIRE"?

Il est généralement préférable pour chaque table SQL Server d'avoir un index clusterisé, et un seul index clusterisé est autorisé par table car les nœuds feuilles b-tree de l'index clusterisé sont les pages de données réelles. L'index supportant la key primaire est souvent le meilleur candidat mais vous pouvez rendre le PK non-cluster et avoir un index différent de celui du cluster si cela est avantageux pour votre situation particulière. Par exemple, si vos requêtes portent le plus souvent sur COLUMN3 à la place des requêtes sélectionnées ou jointes par COLUMN1, l'index COLUMN3 peut être un meilleur choix avec une key primaire NONCLUSTERED.

2.Dans la table MySql d'origine, COLUMN3 est indexé. L'INDEX NONCLUSTER est-il l'équivalent de Sql Server? Quel est le sens de

Un index non clusterisé est également un index b-tree, permettant aux lignes d'être localisées par la key d'index plus efficacement qu'une parsing de table.

3.Je n'ai pas compris ce qui suit:

EXECUTE sp_addextendedproperty @name = N'MS_SSMA_SOURCE ', @value = N'TABLE1', @ niveau0type = N'SCHEMA ', @ niveau0nom = N'dbo', @ niveau1type = N'TABLE ', @ niveau1nom = N'TABLE1';

Quelqu'un peut-il expliquer ce qu'il fait?

SQL Server possède une fonctionnalité de propriété étendue qui vous permet de joindre des métadonnées à des objects de database. Dans ce cas, SSMA a ajouté une propriété étendue pour indiquer que la table a été créée par l'outil.

4. Est-ce que le text ci-dessus crée la syntaxe minimale de la table pour accomplir ce qu'elle fait?

Non. Par exemple, on pourrait omettre les noms de contraintes et SQL Server générerait automatiquement un nom. Cependant, la meilleure pratique consiste à nommer explicitement les contraintes pour faciliter les modifications DDL ultérieures et pour que le but soit auto-documenté. Personnellement, je nommerais les contraintes par défaut comme DF_TABLENAME_COLUMNNAME.

5.J'ai 131555 lignes dans ma table MySql. Dois-je spécifier IDENTITY (131556, 1) pour démarrer l'incrémentation automatique de la key à partir de 131556 après la migration des données?

Si vous deviez créer la table avec IDENTITY (1,1), puis insert des lignes avec l'option IDENTITY INSERT ON, SQL Server ajustera automatiquement l' IDENTITY suivante en fonction de la valeur la plus élevée insérée. Je ne sais pas grand-chose sur SSMA mais il semble que SSMA l'ait déjà fait pour vous.

1 et 2. Vous devriez probablement lire cette description des différences entre un index clusterisé et non cluster: http://msdn.microsoft.com/fr-fr/library/ms190457.aspx . En bref, il ne peut y avoir qu'un seul index cluster sur une table et il définit l'ordre de sorting des données dans la table. Vous pouvez avoir plusieurs index non clusterisés sur une table.

  1. SQL Server vous permet d'append des propriétés étendues aux objects – voir ici pour plus de détails: http://technet.microsoft.com/en-us/library/ms190243%28v=sql.105%29.aspx . Fondamentalement, ils sont pour stocker des métadonnées sur l'object – une description pour la table par exemple, ou un masque de saisie pour une colonne.

  2. Voici la syntaxe complète pour créer des tables: http://msdn.microsoft.com/fr-fr/library/ms174979.aspx . Je note que votre exemple crée la table et ajoute quelques contraintes par défaut. Vous pourriez réécrire cela comme

      CREATE TABLE [dbo].[TABLE1] ( [COLUMN1] BIGINT IDENTITY (131556, 1) NOT NULL, [COLUMN2] INT DEFAULT ((0)) NULL, [COLUMN3] INT NULL DEFAULT (0), CONSTRAINT [PK_TABLE1] PRIMARY KEY CLUSTERED ([COLUMN1] ASC) ); 
  3. Cela dépend vraiment si vous voulez conserver vos valeurs de key existantes, ce que je suppose que vous faites. Si oui, vous devez insert datatables avec

    SET IDENTITY_INSERT yourTable ON

Lisez à propos des colonnes d'identité ici: http://msdn.microsoft.com/fr-fr/library/ms186775.aspx