7
votes

Le PK d'une table DB2 est-il un indice en cluster par défaut?

Cela peut être une question idiote mais je veux être sûr à 100%.

est le pc d'une table DB2 un indice en clustered par défaut?


0 commentaires

3 Réponses :


0
votes

db2 ne crée pas d'index en cluster pour un PK par défaut.

clés primaires

Une clé primaire est un type spécial de clé unique et ne peut pas contenir des valeurs nulles. Par exemple, la colonne DEPTNO dans la table de DEPT est une clé primaire.

Une table ne peut avoir plus d'une clé primaire. Les touches principales sont facultatives et peuvent être définies dans Create Table ou modifier des instructions de table.

L'index unique sur une clé primaire s'appelle un indice principal. Lorsqu'une clé primaire est définie dans une instruction de tableau Créer ou d'altéré de tableau, DB2 crée automatiquement l'index principal si l'une des conditions suivantes est vraie:

DB2 fonctionne en mode de nouvelle fonction et l'espace de la table est créé implicitement. DB2 fonctionne en mode de nouvelle fonction, l'espace de table est explicitement créé et le processeur de schéma est en cours d'exécution. DB2 fonctionne en mode de conversion et le processeur de schéma est en marche. Si un indice unique existe déjà sur les colonnes de la clé primaire lorsqu'il est défini dans l'instruction ALTER TABLE, cet indice unique est désigné comme indice principal lorsque DB2 fonctionne en mode de nouvelle fonction et crée implicitement l'espace de la table.

voir à: clés db2


4 commentaires

Cela stipule qu'un index est créé pour un PK. La question est, c'est un Index en cluster ? C'est-à-dire que le PK [index] définit-il l'emplacement physique des données de la ligne qui n'est pas couverte par la PK?


Voir aussi: Wikipedia: Index en cluster et Index en cluster et Types d'index DB2


Voyez-vous Index clustered à la documentation? Ensuite .. DB2 Ne le créez pas pour un PK par Befault ...


@Andersoncarniel: Vous voulez peut-être ajouter que dans votre réponse ( "DB2 ne crée pas d'index en cluster pour un PK par défaut." )



8
votes

de: DB2 DOCS - Index de la clustering

Bien qu'une table puisse avoir plusieurs index, un seul index peut être un indice de clustering. Si vous ne définissez pas un index de clustering pour une table, DB2 reconnaît le premier index créé sur la table comme indice de clustering implicite lorsqu'il commande les lignes de données.

Donc non, par défaut, la clé primaire n'est pas l'index en cluster de la table.

Le premier index créé, unique ou non, est l'index de clustering "implicite" et DB2 tente d'insérer les enregistrements le plus possible dans l'ordre des valeurs de cet index.

Si vous créez une autre autre index et que vous l'identifiez comme en clustering, DB2 l'identifie comme indice de clustering mais ne réorganise pas les données qui est déjà dans la table. Cela peut être fait avec l'utilitaire Reorg.


1 commentaires

Je me suis toujours demandé quelle était la Hullabaloo sur Reorgs autour d'ici. Maintenant je sais. Merci! (Même si je ne suis pas le PO)



2
votes

à partir du Publib (Ceci assume DB2 pour z / OS, version 9)

Lorsqu'une table a un indice de clustering, une instruction insertion provoque DB2 à insérez les enregistrements aussi près que possible dans l'ordre de leur index valeurs. Le premier index que vous définissez sur la table sert implicitement Comme indice de clustering, sauf si vous spécifiez explicitement le cluster lorsque vous créer ou modifier un autre index. strong> par exemple, si vous définissez d'abord un Index unique sur la colonne EMPNO de la table EMP, DB2 Insère des rangées dans la table EMP dans l'ordre du numéro d'identification de l'employé Sauf si vous définissez explicitement un autre index pour être l'indice de clustering. P> blockQuote>

Vous pouvez voir quel index est l'index de clustering pour une table (dans cet exemple, test.table1 code>) à l'aide de la requête suivante, si vous êtes sur z / OS: xxx pré>

et celui-ci pour Linux / UNIX / Windows (LUW): P>

SELECT *
FROM SYSCAT.INDEXES
WHERE TABSCHEMA = 'TEST'
  AND TABNAME   = 'TABLE1'
  AND INDEXTYPE = 'CLUS'


2 commentaires

Merci d'avoir répondu. BTW: Cette requête ne fonctionne pas, je reçois cette erreur sql0206n "clustering" n'est pas valide dans le contexte où il est utilisé. Sqlstate = 42703


@LUKA, alors vous pouvez utiliser DB2 sur LUW. J'ai ajouté une deuxième requête qui devrait vous obtenir les mêmes informations.