Quale query SQL mi mostra le tabelle e gli indici utilizzati da una vista su Informix?

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

  •  08-07-2019
  •  | 
  •  

Domanda

Quale query SQL mi mostra le tabelle & amp; indici utilizzati da una vista su Informix?

So come trovare l'istruzione di creazione originale "quot" " per una vista in SYS_VIEWS, ma ciò richiede una scansione / grokking del cervello umano che selezioni. Credo di poter trovare se le tabelle sono indicizzate, una volta che sono state identificate.

Contesto: devo accertarmi che alcune viste critiche puntino a tabelle correnti (ad es. dopo essere state "riorganizzate"). Troppo spesso ho visto viste che puntano a vecchie tabelle di backup, che non erano più indicizzate e impiegavano un'eternità a interrogare.

Devo identificare queste query regolarmente e " ricordare " l'ottimizzazione DBA per ricostruire le visualizzazioni / indici.

È stato utile?

Soluzione

I documenti della tabella sysdepend visualizzano le dipendenze. Le colonne sono:

  • btabid - numero ID della tabella di base
  • btype - normalmente T per tabella o V per vista
  • dtabid - numero ID tabella dipendente
  • dtype - normalmente T per tabella o V per vista

Di conseguenza, per una determinata vista con tabid N, puoi scrivere:

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

Se conosci solo il nome della vista, determinare il tabid della vista è sorprendentemente complicato se il tuo database è un database MODE ANSI in cui potresti avere più tabelle con lo stesso nome di tabella (o nome della vista in questo caso) ma ognuna con un proprietario diverso. Tuttavia, nel solito caso (un database non ANSI o un nome tabella / vista univoco), la query è abbastanza semplice:

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 domanda fa domande sugli indici usati da una vista. Gli indici non sono usati da una vista di per sé; gli indici vengono utilizzati dal motore di query durante l'elaborazione di una query, ma gli indici utilizzati potrebbero cambiare in base alla query totale, pertanto è possibile utilizzare indici diversi per queste due query:

SELECT * FROM SomeView;

SELECT * FROM SomeView
    WHERE Column1 BETWEEN 12 AND 314;

Gli indici che verranno utilizzati non sono registrati in nessun punto del catalogo di sistema; vengono rideterminati dinamicamente quando viene preparata un'istruzione.

La domanda nota anche:

  

Contesto: devo accertarmi che alcune viste critiche puntino a tabelle correnti (ad es. dopo essere state "riorganizzate"). Troppo spesso ho visto viste che puntano a vecchie tabelle di backup, che non erano più indicizzate e impiegavano un'eternità a interrogare.

Come si esegue la riorganizzazione? Crei una nuova tabella con la struttura desiderata, copi i dati dal vecchio al nuovo, quindi rinomina il vecchio, rinomina il nuovo? Probabilmente questa sarebbe la spiegazione: la ridenominazione della tabella rielabora le viste che fanno riferimento alla tabella. Che forma di riorganizzazione stai facendo? Puoi usare una tecnica diversa? Uno standby classico consiste nell'utilizzare ALTER INDEX nome indice IN CLUSTER (dopo averlo modificato in NOT CLUSTER se era già in cluster). Ciò ricostruisce la tabella e gli indici, senza interrompere le viste. In alternativa, puoi considerare un'operazione ALTER FRAGMENT.

Sembra anche un po 'strano mantenere i vecchi tavoli in giro. Ciò suggerisce che la tua riorganizzazione è più una questione di eliminare vecchi dati. Forse dovresti frammentare la tabella per intervalli di date, in modo da staccare un frammento quando ha raggiunto la data di "fine vita utile". Se si trascinano le tabelle, le viste che dipendono da essa verranno eliminate, assicurandosi di ricostruire le viste con i nuovi nomi delle tabelle.

Un'altra alternativa, quindi, è semplicemente quella di garantire che la riorganizzazione riduca e ricrea i punti di vista.

  

Devo identificare queste query regolarmente e " ricordare " l'ottimizzazione DBA per ricostruire le visualizzazioni / indici.

Preoccupante ... dovrebbe essere solo parte della procedura standard per completare la riorganizzazione. Fondamentalmente, hai un bug da segnalare in quella procedura - non garantisce che le viste siano completamente operative.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top