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

我知道如何在 SYS_VIEWS 中找到视图的“原始创建语句”,但这需要人脑扫描/摸索选择。我相信一旦识别出这些表是否已建立索引,我就可以找到它们。

背景:我需要确保一些批评观点指向当前(例如被“重组”后)表。我经常看到指向旧备份表的视图,这些表不再索引,并且需要很长时间才能查询。

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

有帮助吗?

解决方案

桌子 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;

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

问题还指出:

背景:我需要确保一些批评观点指向当前(例如被“重组”后)表。我经常看到指向旧备份表的视图,这些表不再索引,并且需要很长时间才能查询。

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

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

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

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

令人担忧……这应该只是完成重组的标准程序的一部分。基本上,您在该过程中需要报告一个错误 - 它不能确保视图完全可操作。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top