1

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

我知道如何在 SYS_VIEWS 中找到视图的“原始创建语句”,但这需要人脑扫描/探索该选择。我相信一旦确定了表格,我就可以找到它们是否被索引。

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

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

4

1 回答 1

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;

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

该问题还指出:

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

How do you do your reorganization? Do you create a new table with the desired structure, copy the data from old to new, then rename old, rename new? That probably would be the explanation - the table renaming reworks the views that reference the table. What form of reorganization are you doing? Can you use a different technique? A classic standby is to use ALTER INDEX indexname TO CLUSTER (after altering it to NOT CLUSTER if it was already clustered). This rebuilds the table and the indexes - without the views breaking. Alternatively, you can consider an ALTER FRAGMENT operation.

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

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

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

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

于 2008-11-21T07:19:35.737 回答