Quelle requête SQL me montre les tables et les index utilisés par une vue sur Informix?

StackOverflow https://stackoverflow.com/questions/307983

  •  08-07-2019
  •  | 
  •  

Question

Quelle requête SQL me montre les tables & amp; index utilisés par une vue sur Informix?

Je sais comment trouver la " déclaration de création originale " pour une vue dans SYS_VIEWS, mais cela nécessite une analyse du cerveau humain / grokking qui sélectionne. Je pense pouvoir trouver si les tables sont indexées, une fois qu'elles ont été identifiées.

Contexte: je dois m'assurer que certaines vues critiques pointent vers les tables actuelles (par exemple, après avoir été "réorganisées"). Trop souvent, j'ai vu des vues pointant sur d'anciennes tables de sauvegarde, qui n'étaient plus indexées et qui mettaient toujours beaucoup de temps à interroger.

Je dois identifier ces requêtes régulièrement et "rappeler". DBA de réglage pour reconstruire les vues / index.

Était-ce utile?

La solution

La table sysdepend dépend de la vue des documents. Les colonnes sont:

  • btabid - numéro d'identification de la table de base
  • btype - normalement T pour la table ou V pour la vue
  • dtabid - numéro d'identification de la table dépendante
  • dtype - normalement T pour la table ou V pour la vue

Par conséquent, pour une vue avec la tabule N, vous pouvez écrire:

SELECT b.owner, b.tabname, d.*
    FROM "informix".systables b, "informix".sysdepend d
    WHERE d.dtabid = N
      AND d.btabid = b.tabid;

Si vous ne connaissez que le nom de la vue, il est étonnamment difficile de déterminer le tabid de la vue si votre base de données est une base de données MODE ANSI dans laquelle vous pouvez avoir plusieurs tables portant le même nom de table (ou le nom de la vue dans le cas présent), mais chacune avec une propriétaire différent. Cependant, dans le cas habituel (base de données non ANSI, ou nom de table / vue unique), la requête est assez simple:

SELECT b.owner, b.tabname, d.*
    FROM "informix".systables b, "informix".sysdepend d
    WHERE d.dtabid = (SELECT v.tabid FROM "informix".systables v
                         WHERE v.tabname = "viewname"
                     )
      AND d.btabid = b.tabid;

La question concerne les index utilisés par une vue. Les index ne sont pas utilisés par une vue en soi; les index sont utilisés par le moteur de requête lors du traitement d'une requête, mais les index utilisés peuvent changer en fonction du nombre total de requêtes. Des index différents peuvent donc être utilisés pour ces deux requêtes:

SELECT * FROM SomeView;

SELECT * FROM SomeView
    WHERE Column1 BETWEEN 12 AND 314;

Les index qui seront utilisés ne sont enregistrés nulle part dans le catalogue système. ils sont redéterminés dynamiquement lorsqu’une instruction est préparée.

La question indique également:

  

Contexte: je dois m'assurer que certaines vues critiques pointent vers les tables actuelles (par exemple après avoir été "réorganisées"). Trop souvent, j'ai vu des vues pointant sur d'anciennes tables de sauvegarde, qui n'étaient plus indexées et dont l'interrogation prenait une éternité.

Comment faites-vous votre réorganisation? Créez-vous une nouvelle table avec la structure souhaitée, copiez les données de l’ancien vers le nouveau, puis renommez l’ancien, renommez nouveau? Ce serait probablement l'explication - la table renommée retravaille les vues qui référencent la table. Quelle forme de réorganisation faites-vous? Pouvez-vous utiliser une technique différente? Un mode d’attente classique consiste à utiliser ALTER INDEX indexname TO CLUSTER (après l’avoir modifiée en NOT CLUSTER si elle était déjà en cluster). Ceci reconstruit la table et les index - sans que les vues ne se brisent. Vous pouvez également envisager une opération ALTER FRAGMENT.

Il semble également un peu étrange de garder les anciennes tables autour. Cela suggère que votre réorganisation est davantage une question de suppression d’anciennes données. Peut-être devriez-vous fragmenter votre tableau par plages de dates afin de détacher un fragment lorsqu'il aura atteint sa date de «fin de vie utile». Si vous supprimez les tables, vous supprimez également les vues qui en dépendent, ce qui vous permet de reconstruire les vues avec les nouveaux noms de table.

Une autre solution consiste donc simplement à vous assurer que la réorganisation supprime et recrée les vues.

  

Je dois identifier ces requêtes régulièrement et "rappeler". DBA de réglage pour reconstruire les vues / index.

Inquiétant ... cela devrait simplement faire partie de la procédure standard pour mener à bien la réorganisation. En gros, vous devez signaler un bogue dans cette procédure: cela ne garantit pas que les vues sont pleinement opérationnelles.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top