web-dev-qa-db-fra.com

Comment créer un index clusterisé et non clusterisé dans Oracle?

J'ai creusé quelques heures concernant ma question et je n'ai pas obtenu de réponse satisfaisante. J'ai encore un doute. J'ai trouvé ce qui suit sur l'index clusterisé:

  1. Les données sont stockées dans l'ordre de l'index clusterisé.
  2. Un seul index cluster par table.
  3. Lorsqu'une clé primaire est créée, un index de cluster est également créé automatiquement.

J'ai obtenu ces points, mais mes questions sont:

  1. Est-ce que l'index de cluster existe dans la base de données Oracle depuis que j'ai lu dans certains blogs "Oracle n'a pas de concept d'index cluster."
  2. Si oui, faites-le moi savoir instruction sql pour créer un index de cluster .
  3. Comme indiqué ci-dessus, l'index de cluster est automatiquement créé lorsque la clé primaire est définie sur une colonne d'une table, comment puis-je vérifier le type d'index s'il est créé ou non?

Veuillez trouver mon architecture de table:

enter image description here

Faites-moi savoir si autre chose est nécessaire pour obtenir des réponses à ces questions.

9
Prabhakar

L'index de cluster existe-t-il dans la base de données Oracle depuis que j'ai lu dans certains blogs

Oui il y a.

Il est appelé "table organisée par index" (IOT) - qui, à mon avis, est le meilleur nom car il indique clairement que l'index et la table sont la même chose physique (ce qui explique pourquoi ne peut avoir que un index cluster dans SQL Server)

Si oui, faites-moi savoir l'instruction SQL pour créer un index de cluster.

Il n'y a rien de tel que create clustered index dans Oracle.

Pour créer une table organisée par index, vous utilisez le create table instruction avec le organization index option.

Dans Oracle, vous utilisez généralement les IOT pour les tables très étroites. Très souvent pour les tables qui ne comprennent que les colonnes de clé primaire (par exemple, les tables de mappage m: n), par exemple.

create table assignment
(
   person_id  integer not null, 
   job_id     integer not null, 
   primary key (person_id, job_id)
)
organization index;

Vous pouvez créer des IOT avec plus de colonnes, dans ce cas, vous devez définir les colonnes non-pk comme des colonnes "incluses". Par exemple. si la table d'affectation doit avoir des colonnes supplémentaires, comme les dates de début et de fin qui ne font pas partie de la clé primaire:

create table assignment
(
   person_id   integer not null, 
   job_id      integer not null, 
   start_date  date, 
   end_date    date,
   primary key (person_id, job_id)
)
organization index
including start_date
overflow storage (initial 4k);

Voir le manuel pour plus de détails et d'exemples: https://docs.Oracle.com/database/121/SQLRF/statements_7002.htm#i2153235


Un peu sans rapport, mais peut-être intéressant de toute façon:

Un article de blog intéressant qui remet en question le comportement de SQL Server (et MySQL) de l'utilisation d'un index cluster comme valeur par défaut lors de la création d'une table:

Valeurs par défaut déraisonnables: clé primaire comme clé de clustering

Venant d'un milieu Oracle, je suis entièrement d'accord avec cela.

17
a_horse_with_no_name

J'ai trouvé ce qui suit sur l'index clusterisé:

  1. Les données sont stockées dans l'ordre de l'index clusterisé.
  2. Un seul index cluster par table.
  3. Lorsqu'une clé primaire est créée, un index de cluster est également créé automatiquement.

Vous avez creusé quelques heures. Vous devriez avoir remarqué que tous les faits ci-dessus sont pour SQL Server et pas Oracle .

Les tables (au moins ordinaires) dans Oracle n'ont pas d'index cluster. Il existe un type spécial de tables, appelées Tables organisées par index (IOT) qui sont de concept similaire. Détails dans documentation Oracle (9i): Index Organized Tables :

Que sont les tables organisées par index?

Une table organisée par index - contrairement à une table ordinaire - a sa propre façon de structurer, de stocker et d'indexer les données. Une comparaison avec un tableau ordinaire peut aider à expliquer son caractère unique.

Tableaux organisés par index et tableaux ordinaires

Une ligne d'une table ordinaire a un emplacement physique stable. Une fois cet emplacement établi, la ligne ne se déplace jamais complètement. Même s'il est partiellement déplacé avec l'ajout de nouvelles données, il y a toujours un élément de ligne à l'adresse physique d'origine - identifié par l'ID physique d'origine - à partir duquel le système peut trouver le reste de la ligne. Tant que la ligne existe, son rowid physique ne change pas. Un index dans une table ordinaire stocke à la fois les données de la colonne et le rowid.

Une ligne d'une table organisée en index n'a pas d'emplacement physique stable. Il conserve les données dans un ordre trié, dans les feuilles d'un index B * -tree construit sur la clé primaire de la table. Ces lignes peuvent se déplacer pour conserver l'ordre de tri. Par exemple, une insertion peut entraîner le déplacement d'une ligne existante vers un emplacement différent, voire vers un bloc différent.

Les feuilles de l'index de l'arbre B * contiennent la clé primaire et les données de ligne réelles. Les modifications apportées aux données de la table - par exemple, l'ajout de nouvelles lignes ou la mise à jour ou la suppression de lignes existantes - entraînent uniquement la mise à jour de l'index.

Voir aussi la documentation sur (11g): Index Organized Tables dans la version la plus récente d'Oracle 11g.

8
ypercubeᵀᴹ