2008-12-08 36 views
2

Nous avons donc été informés qu'une source de conflit TM Enq peut être des FK non indexés. Ma question est la suivante. J'ai un INSERT INTO Table_B qui enregistre TM Enq Wait.La clé étrangère non indexée mène à la contestation de la mémoire en attente TM

Il contient un PK qui est le parent des autres tables et dont les colonnes FK sont contraintes à d'autres PK s.

Alors, quels sont FK besoin d'être indexé: les colonnes de cette table ou ses enfants?

NB: Je sais que ce n'est pas la seule cause de TM Contention. Pouvez-vous expliquer pourquoi cela ne pourrait pas être le cas si c'est le cas.

Répondre

2

Je ne suis pas sûr d'Oracle TM Contention, mais je dirais que normalement les deux côtés d'une relation de clé étrangère sont indexés. Sinon, la base de données devra effectuer des analyses de table. L'index de l'enregistrement parent est utilisé chaque fois que vous insérez un nouvel enregistrement enfant pour vérifier que le parent existe. Souvent, c'est aussi une clé primaire, donc bien sûr, il y a un index.

  • L'index de l'enregistrement enfant est utilisé chaque fois que vous modifiez ou supprimez un enregistrement parent pour effectuer des cascades (y compris le refus de la mise à jour/suppression). Les index des deux côtés donnent également à la base de données une bonne chance de faire des jointures rapides (indexées), quel que soit le côté dont son optimiseur préfère provenir.

    EDIT: En ayant un conflit avec Google, il semble que vous manquiez probablement les clés des enregistrements enfants. Mais assurez-vous de les avoir des deux côtés, vraiment.

    EDIT 2: Répondre au commentaire,

    Si vous avez une table OLTP qui a 13 FKs Lookup tables, je ne suis pas férus de 13 mises à jour de l'index, en plus de la table, pk et tout autre index . Un index est important mais pour des raisons spécifiques. Si vous n'avez jamais mis à jour le PK parent ni supprimer le parent, l'index enfant est pas si utile. Ou est-ce? Cela dépend des jointures et des requêtes que vous exécutez, puis de

    Par exemple, si vous exécutez une requête comme:

    SELECT o.something 
        FROM oltp_tab o JOIN lookup l ON (o.lookup_no = l.lookup_no) 
        WHERE l.lookup_name = ? 
    

    l'optimiseur de requête serait probablement comme l'indice sur l'enfant dossiers.


    En outre, selon http://ashmasters.com/waits/enq-tm-contention/ vous à peu près besoin d'avoir les indices si vous modifiez les tables parent à tous. Apparemment, vous obtenez des modifications simultanées aux tables parent et enfant , sauf si vous avez l'index.Ceci est probablement ce que vous voyez (en supposant que vous ne faites pas les choses évidentes, comme mettre à jour les colonnes référencées ou supprimer des lignes)

  • +0

    Si vous avez une table OLTP qui a 13 FKs aux tables de recherche, je ne tiens pas à 13 mises à jour d'index en plus de la table, pk et d'autres index. Un index est important mais pour des raisons spécifiques. Si vous ne mettez jamais à jour le PK parent ni ne le supprimez du parent, l'index enfant n'est pas très utile. Ou est-ce? –

    +0

    Répondu en ligne. – derobert

    +0

    Intéressant article connexe https://www.crealoq.com/solved/ORACLE-enq-TM-contention-or-How-long-it-takes-to-update-an-empty-table – clq

    1

    La colonne parent (référencée) d'une relation de clé étrangère activée doit être indexé car il doit avoir une contrainte de clé unique ou primaire activée sur celui-ci.

    Quel mode de TM Enqueue voyez-vous?