¿Qué consulta SQL me muestra las tablas e índices utilizados por una vista en Informix?

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

  •  08-07-2019
  •  | 
  •  

Pregunta

¿Qué consulta SQL me muestra las tablas & amp; Qué índices utiliza una vista en Informix?

Sé cómo encontrar la " declaración de creación original " para una vista en SYS_VIEWS, pero eso requiere un escaneo / exploración del cerebro humano que seleccione. Creo que puedo encontrar si las tablas están indexadas, una vez que se han identificado.

Antecedentes: necesito asegurarme de que algunas vistas críticas apunten a tablas actuales (por ejemplo, después de ser " reorganizadas "). Con demasiada frecuencia he visto vistas que apuntan a tablas de copia de seguridad antiguas, que ya no estaban indexadas, y me llevó una eternidad consultarlas.

Necesito identificar estas consultas regularmente y "recordar" el DBA de ajuste para reconstruir las vistas / índices.

¿Fue útil?

Solución

Los documentos de la tabla sysdepend ven las dependencias. Las columnas son:

  • btabid - número de ID de la tabla base
  • btype: normalmente T para tabla o V para visualización
  • dtabid - número de ID de tabla dependiente
  • dtype: normalmente T para tabla o V para visualización

Por consiguiente, para una vista dada con el tabid N, puede escribir:

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

Si solo conoce el nombre de la vista, determinar la tabla de la vista es sorprendentemente complicado si su base de datos es una base de datos MODE ANSI donde puede tener varias tablas con el mismo nombre de tabla (o nombre de la vista en este caso) pero cada una con un propietario diferente Sin embargo, en el caso habitual (una base de datos no ANSI o un nombre de tabla / vista único), la consulta es bastante fácil:

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 pregunta se refiere a los índices utilizados por una vista. Los índices no son utilizados por una vista, per se; el motor de consulta utiliza los índices cuando procesa una consulta, pero los índices utilizados pueden cambiar dependiendo de la consulta total, por lo que podrían usarse diferentes índices para estas dos consultas:

SELECT * FROM SomeView;

SELECT * FROM SomeView
    WHERE Column1 BETWEEN 12 AND 314;

Los índices que se utilizarán no se registran en ninguna parte del catálogo del sistema; se vuelven a determinar dinámicamente cuando se prepara una declaración.

La pregunta también señala:

  

Antecedentes: necesito asegurarme de que algunas vistas críticas apunten a tablas actuales (por ejemplo, después de ser " reorganizadas "). Con demasiada frecuencia he visto vistas que apuntan a tablas de copia de seguridad antiguas, que ya no estaban indexadas, y me llevó una eternidad consultarlas.

¿Cómo haces tu reorganización? ¿Crea una nueva tabla con la estructura deseada, copia los datos de viejo a nuevo, luego cambia el nombre de viejo, cambia el nombre de nuevo? Probablemente esa sea la explicación: el cambio de nombre de la tabla modifica las vistas que hacen referencia a la tabla. ¿Qué forma de reorganización estás haciendo? ¿Puedes usar una técnica diferente? Un modo de espera clásico es usar ALTER INDEX indexname TO CLUSTER (después de alterarlo a NOT CLUSTER si ya estaba agrupado). Esto reconstruye la tabla y los índices, sin que se rompan las vistas. Alternativamente, puede considerar una operación ALTERAR FRAGMENTO.

También parece un poco extraño mantener las viejas tablas. Eso sugiere que su reorganización es más una cuestión de descartar datos antiguos. Tal vez debería fragmentar su tabla por rangos de fechas, de modo que separe un fragmento cuando haya llegado a la fecha de "fin de la vida útil". Eliminar las tablas también eliminaría las vistas que dependen de ella, asegurando que reconstruya las vistas con los nuevos nombres de tabla.

Otra alternativa, por lo tanto, es simplemente garantizar que la reorganización caiga y vuelva a crear las vistas.

  

Necesito identificar estas consultas regularmente y "recordar" el DBA de ajuste para reconstruir las vistas / índices.

Preocupante ... debería ser parte del procedimiento estándar para completar la reorganización. Básicamente, tiene un error que informar en ese procedimiento: no garantiza que las vistas estén completamente operativas.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top