SQL查询向我显示了表格和表格。 Informix上的视图使用的索引?
我知道如何在SYS_VIEWS中查找视图的“原始创建语句”,但这需要人脑扫描/ grokking选择。我相信,一旦确定了表格,我就能找到这些表格。
背景:我需要确定一些关键视图指向当前(例如在“重组后”)表。我经常看到指向旧备份表的视图,这些视图不再被编入索引,并且需要永远查询。
我需要定期识别这些查询并“提醒”调优DBA重建视图/索引。
答案 0 :(得分:2)
表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;
将使用的索引不会记录在系统目录中的任何位置;在准备一份陈述时,它们会动态重新确定。
该问题还指出:
背景:我需要确定一些关键视图指向当前(例如在“重组后”)表。我经常看到指向旧备份表的视图,这些视图不再被编入索引,并且需要永远查询。
你如何进行重组?您是否创建了具有所需结构的新表,将数据从旧复制到新,然后重命名为旧,重命名为new?这可能是解释 - 表重命名重新引用引用表的视图。你在做什么形式的重组?你能用不同的技术吗?经典待机是使用ALTER INDEX indexname TO CLUSTER(如果它已经聚集,则将其更改为NOT CLUSTER)。这会重建表和索引 - 不会破坏视图。或者,您可以考虑ALTER FRAGMENT操作。
保持旧桌子周围似乎有点奇怪。这表明您的重组更多的是丢弃旧数据的问题。也许您应该按日期范围对表进行分段,以便在片段达到“使用寿命结束”日期时分离。删除表也会删除依赖它的视图,确保使用新表名重建视图。
因此,另一种选择是简单地确保重组下降并重新创建视图。
我需要定期识别这些查询并“提醒”调优DBA重建视图/索引。
令人担忧......它应该只是完成重组的标准程序的一部分。基本上,您在该过程中有一个错误报告 - 它不能确保视图完全正常运行。