2008-11-21 10 views
1

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

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

背景:我需要确定一些重要的观点指向当前(例如在“重组”之后)表格。我经常看到指向旧备份表的视图,这些旧备份表不再被索引,并且一直持续查询。

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

回答

2

sysdepend文档视图依赖关系。的列有:

  • btabid - 基表ID号码
  • BTYPE - 正常T代表表或V为视图
  • dtabid - 依赖表ID号码
  • D型细胞 - 正常T代表表或V为鉴于

因此,对于tabid N A给定的视图,你可以这样写:

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 indexname TO CLUSTER(在将其更改为NOT CLUSTER之后,如果它已经被群集)。这将重建表和索引 - 不会打破视图。或者,您可以考虑使用ALTER FRAGMENT操作。

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

因此,另一种替代方法是简单地确保重组删除并重新创建视图。

我需要定期确定这些查询和“提醒”调谐DBA重建的意见/索引。

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

+0

问题:你如何进行重组?
答案:我不做reorg,它是由上帝(DBA)完成的,不需要关心用户添加的视图。 这是他的数据库,毕竟 感谢您的答案。我希望我能从这里管理。 – lexu 2008-11-22 09:46:36

相关问题