什么SQL查询向我显示Informix上的视图使用的表和索引?

时间:2008-11-21 05:47:35

标签: sql informix

SQL查询向我显示了表格和表格。 Informix上的视图使用的索引?

我知道如何在SYS_VIEWS中查找视图的“原始创建语句”,但这需要人脑扫描/ grokking选择。我相信,一旦确定了表格,我就能找到这些表格。

背景:我需要确定一些关键视图指向当前(例如在“重组后”)表。我经常看到指向旧备份表的视图,这些视图不再被编入索引,并且需要永远查询。

我需要定期识别这些查询并“提醒”调优DBA重建视图/索引。

1 个答案:

答案 0 :(得分:2)

sysdepend文档查看依赖项。列是:

  • btabid - 基表ID号
  • btype - 表格通常为T或视图为V
  • dtabid - 依赖表ID号
  • dtype - 通常用于表格T或视图用V

因此,对于tabid N的给定视图,您可以写:

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

如果您只知道视图名称,那么如果您的数据库是MODE ANSI数据库,您可能有多个表具有相同的表名(或本例中的视图名称),但每个表都有一个,那么确定视图的tabid是非常棘手的。不同的主人。但是,在通常情况下(非ANSI数据库或唯一的表/视图名称),查询很容易:

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;

该问题询问视图使用的索引。视图本身不使用索引;处理查询时,查询引擎使用索引,但所使用的索引可能会根据总查询而更改 - 因此可能会对这两个查询使用不同的索引:

SELECT * FROM SomeView;

SELECT * FROM SomeView
    WHERE Column1 BETWEEN 12 AND 314;

将使用的索引不会记录在系统目录中的任何位置;在准备一份陈述时,它们会动态重新确定。

该问题还指出:

  

背景:我需要确定一些关键视图指向当前(例如在“重组后”)表。我经常看到指向旧备份表的视图,这些视图不再被编入索引,并且需要永远查询。

你如何进行重组?您是否创建了具有所需结构的新表,将数据从旧复制到新,然后重命名为旧,重命名为new?这可能是解释 - 表重命名重新引用引用表的视图。你在做什么形式的重组?你能用不同的技术吗?经典待机是使用ALTER INDEX indexname TO CLUSTER(如果它已经聚集,则将其更改为NOT CLUSTER)。这会重建表和索引 - 不会破坏视图。或者,您可以考虑ALTER FRAGMENT操作。

保持旧桌子周围似乎有点奇怪。这表明您的重组更多的是丢弃旧数据的问题。也许您应该按日期范围对表进行分段,以便在片段达到“使用寿命结束”日期时分离。删除表也会删除依赖它的视图,确保使用新表名重建视图。

因此,另一种选择是简单地确保重组下降并重新创建视图。

  

我需要定期识别这些查询并“提醒”调优DBA重建视图/索引。

令人担忧......它应该只是完成重组的标准程序的一部分。基本上,您在该过程中有一个错误报告 - 它不能确保视图完全正常运行。