Informixのビューで使用されるテーブルとインデックスを示すSQLクエリは何ですか?

StackOverflow https://stackoverflow.com/questions/307983

  •  08-07-2019
  •  | 
  •  

質問

SQLクエリで表示されるテーブル& Informixのビューで使用されるインデックス?

「オリジナルの作成ステートメント」を見つける方法を知っています。 SYS_VIEWSのビューの場合、選択するには人間の脳のスキャン/グロッキングが必要です。テーブルが特定されたら、インデックスが作成されているかどうかを確認できると思います。

背景:一部の重要なビューが現在の(「再編成」後の)テーブルを指していることを確認する必要があります。インデックスが作成されなくなった古いバックアップテーブルを指すビューを頻繁に見ましたが、クエリに永遠に時間がかかりました。

これらのクエリを定期的に特定し、「思い出させる」必要があります。ビュー/インデックスを再構築するためのチューニングDBA。

役に立ちましたか?

解決

テーブル sysdepend はビューの依存関係を文書化します。列は次のとおりです。

  • btabid-ベーステーブルのID番号
  • btype-通常はテーブルの場合はT、ビューの場合はV
  • dtabid-依存するテーブルID番号
  • dtype-通常、テーブルの場合はT、ビューの場合はV

その結果、Nというtabidを持つ特定のビューに対して、次のように記述できます。

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;

質問は、ビューで使用されるインデックスについて尋ねます。インデックスはビュー自体では使用されません。インデックスはクエリを処理するときにクエリエンジンによって使用されますが、使用されるインデックスはクエリ全体によって異なる場合があります。したがって、これら2つのクエリには異なるインデックスが使用される可能性があります。

SELECT * FROM SomeView;

SELECT * FROM SomeView
    WHERE Column1 BETWEEN 12 AND 314;

使用されるインデックスは、システムカタログのどこにも記録されません。ステートメントが準備されると、それらは動的に再決定されます。

質問には次の点にも注意してください:

  

背景:一部の重要なビューが現在の(「再編成」後の)テーブルを指していることを確認する必要があります。頻繁に、インデックスが作成されなくなった古いバックアップテーブルを指すビューを見て、クエリに永遠に時間がかかりました。

再編成はどのように行いますか?目的の構造を持つ新しいテーブルを作成し、データを古いものから新しいものにコピーしてから、古い名前を変更し、新しい名前を変更しますか?それはおそらく説明でしょう-テーブルの名前を変更すると、テーブルを参照するビューが再加工されます。どのような再編成を行っていますか?別の手法を使用できますか?クラシックスタンバイでは、ALTER INDEX indexname TO CLUSTERを使用します(既にクラスター化されている場合はNOT CLUSTERに変更した後)。これにより、ビューが破損することなく、テーブルとインデックスが再構築されます。または、ALTER FRAGMENT操作を検討することもできます。

古いテーブルを保持するのも少し奇妙に思えます。これは、再編成が古いデータの削除の問題であることを示唆しています。おそらく、テーブルを日付範囲でフラグメント化する必要があります。そうすると、フラグメントが「耐用年数の終わり」の日付に達したときにフラグメントを切り離すことができます。テーブルを削除すると、それに依存するビューも削除されるため、新しいテーブル名でビューを再構築できます。

したがって、別の代替方法は、再編成によってビューが削除され、再作成されるようにすることです。

  

これらのクエリを定期的に特定し、「思い出させる」必要があります。ビュー/インデックスを再構築するためのチューニングDBA。

心配...これは、再編成を完了するための標準手順の一部にすぎません。基本的に、その手順で報告するバグがあります-ビューが完全に機能することを保証するものではありません。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top