什么 SQL 查询向我显示了 Informix 上的视图使用的表和索引?
我知道如何在 SYS_VIEWS 中找到视图的“原始创建语句”,但这需要人脑扫描/探索该选择。我相信一旦确定了表格,我就可以找到它们是否被索引。
背景:我需要确保某些关键视图指向当前(例如,在“重组”之后)表。我经常看到指向旧备份表的视图,这些表不再被索引,并且需要很长时间才能查询。
我需要定期识别这些查询并“提醒”调优 DBA 重建视图/索引。
该表sysdepend
记录了视图依赖项。这些列是:
因此,对于带有 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 重建视图/索引。
令人担忧……这应该只是完成重组的标准程序的一部分。基本上,您在该过程中有一个错误要报告 - 它不能确保视图完全可操作。