仮想ハードディスクサイズを縮小する

VirtualPCではファイルが使用している領域が削除後も開放されず、結果として仮想ハードディスクファイルのサイズが肥大していく。この現象を解消するために、手動でハードディスクファイルを縮小する必要がある。
以下の処理により13GBが7GB程度に縮小できた。

環境

手順

  1. ゲストOSでデフラグ
  2. ゲストOSで圧縮前処理
  3. 仮想ハードディスク圧縮処理

ゲストOSでデフラグ

ゲストOSにてデフラグ処理を行う。
「コントロールパネル」→「管理ツール」→「ディスクデフラグ

ゲストOSで圧縮前処理

デフラグで空いた領域に0データを書きこむ処理。これにより圧縮処理時に領域を削除してくれるようになる。

  1. ホストOSにてVirtualPCをインストールしたフォルダ内にあるVirtual Disk Precompactor.isoファイルを探す。
    例)\Microsoft Virtual PC\Virtual Machine Additions\以下
  2. 圧縮対象のゲストOSでVirtuaPCを起動する
  3. VirtualPC上のメニューバーにて「CD」→「ISOイメージのキャプチャ」を選択し、[1]で確認したisoファイルを指定する。
  4. ゲストOS上のCDドライブに、Virtual Disk Precompactorがマウントされる。ダブルクリックで起動。
    2008.07.11追記:ゲストOSがVistaの場合は、右クリック→「管理者として実行」する。
  5. 圧縮前処理が開始する。終了時にメッセージが表示される。

仮想ハードディスク圧縮処理

  1. ホストOSにてVirtualPCコンソールを起動する。
  2. 「設定」→「(対象の)ハードディスク」→「バーチャルディスクウィザード」→「次へ」→「既存のハードディスクの編集」→「圧縮対照のvhdファイルを指定する」→「圧縮する」

PLAN_TABLE

Oracle10g

create table PLAN_TABLE (
        statement_id       varchar2(30),
        plan_id            number,
        timestamp          date,
        remarks            varchar2(4000),
        operation          varchar2(30),
        options            varchar2(255),
        object_node        varchar2(128),
        object_owner       varchar2(30),
        object_name        varchar2(30),
        object_alias       varchar2(65),
        object_instance    numeric,
        object_type        varchar2(30),
        optimizer          varchar2(255),
        search_columns     number,
        id                 numeric,
        parent_id          numeric,
        depth              numeric,
        position           numeric,
        cost               numeric,
        cardinality        numeric,
        bytes              numeric,
        other_tag          varchar2(255),
        partition_start    varchar2(255),
        partition_stop     varchar2(255),
        partition_id       numeric,
        other              long,
        distribution       varchar2(30),
        cpu_cost           numeric,
        io_cost            numeric,
        temp_space         numeric,
        access_predicates  varchar2(4000),
        filter_predicates  varchar2(4000),
        projection         varchar2(4000),
        time               numeric,
        qblock_name        varchar2(30),
        other_xml          clob
);

EXCEL関数

  • シート名を表示

=MID(CELL("filename",$A$1),FIND("]",CELL("filename",$A$1))+1,31)



セルA1にシート名"Sample"が入っているとして

  • SampleシートのセルB2に入力されている値を表示

=INDIRECT(A1&"!"&"$B$2")

  • SampleシートのセルA1にジャンプするハイパーリンク。セルには■が表示される。

=HYPERLINK("#" & A1 & "!A1","■")

Oracle10g マテリアライズド・ビュー(実践)

ノウハウはいいから今すぐマテビューを作りたい人向け。

  1. 権限付与
  2. ログ作成
  3. マテビュー作成

権限付与 他→自(マスタ所持者≠ビュー所持者=作成者)

GRANT CREATE MATERIALIZED VIEW TO [作成者];
GRANT SELECT ON [マスタ所持者].[マスタテーブル名] TO [作成者];

同様にCREATE TABLE,CREATE VIEW,CREATE INDEXも必要。

ログ作成

CREATE MATERIARIZED VIEW LOG ON [マスタテーブル名];

マテビュー作成

CREATE MATERIALIZED VIEW
[マテビュー名]
REFRESH FAST NEXT SYSDATE + 1/288
AS
SELECT [カラム名1],[カラム名2]… FROM [マスタテーブル名];

これで5分間隔で高速リフレッシュを行うマテビューができる。

Oracle10g マテリアライズド・ビュー(ノウハウ)

意味はさておき作成したい人はこちら

って何よ?

「実体」のある表。データウェアハウスやレプリケーションに利用される。元ネタ表の事を「マスタ表」と呼ぶ。

マテリアライズド・ビューとは、ある一時点におけるターゲット・マスターのレプリカのことです。


マテリアライズド・ビューの作成に必要な権限

  • CREATE MATERIALIZED VIEW(マテビューを作成するスキーマに対して)
  • CREATE TABLE, CREATE VIEW, CREATE INDEX(マテビューを所持するスキーマに対して)

以下は、他スキーマのテーブルをマスタ表にする場合

  • その表に対するSELECT権限
  • その表に対するON COMMIT REFRESH権限(ON COMMIT REFRESH句を使用する場合)


CREATE文

CREATE MATERIALIZED VIEW
  マテリアライズド・ビュー名
REFRESH
   リフレッシュ方法 リフレッシュ・モードおよびリフレッシュ時刻
AS サブクエリ

REFRESH句を指定しなければ、自動リフレッシュされない。
更新可能マテリアライズド・ビューを作成するには、"AS"の前に"FOR UPDATE"を指定する。


リフレッシュ方法

FAST 高速リフレッシュ方法。差分のみ更新。マテリアライズド・ビュー・ログを使用するので、このログが存在していない場合には、CREATE文は正常に実行されない。事前に作成する。
COMPLETE 完全リフレッシュ方法。
FORCE デフォルト値。実行時に可能ならば、高速リフレッシュ方法を採用する。不可能ならば完全リフレッシュ方法を採用する。

マスタが「テーブル」「マテビュー」の場合→高速リフレッシュ可能
マスタが「シノニム」「ビュー」の場合→高速リフレッシュ不可。完全リフレッシュのみ。


リフレッシュ・モード

ON COMMIT 自動リフレッシュ。マスタ表のコミットにあわせてリフレッシュ。処理速度は落ちる。
ON DEMAND デフォルト。手動リフレッシュ。
DBMS_MVIEW.REFRESH(ビュー名)またはREFRESH_ALL_MVIEWS()


リフレッシュ時刻

リフレッシュ・モードと同時に指定はできない。

START WITH 最初の自動リフレッシュ時刻を表す日時式。NEXT指定がない場合、マテビューは1回だけリフレッシュされる。
NEXT 自動リフレッシュの間隔を計算するための日時式。START WITH指定がない場合、現在時刻+NEXT時刻を自動的に算出し、自動リフレッシュされる。

日を単位として、時間を制限するすべてのパラメータに対して、分数で日数を指定できる。たとえば、1時間は1/24、5分は1/288、1分は1/1440になる。
例)
NEXT SYSDATE + 1/288
→5分間隔でリフレッシュ。


手動リフレッシュ

  • EXEC DBMS_MVIEW.REFRESH('マテビュー名')
  • VARIABLE a NUMBER;←変数aは必須引数の失敗件数。
     EXEC DBMS_MVIEW.REFRESH_ALL_MVIEW(:a);


"*"の罠

  • 普通のVIEWもそうなのだが、マスタ表の方を「ALTER TABLE 〜」すると、リフレッシュをかけてもALTERの結果は反映されない。「SELECT * 〜」と書いても駄目である。この場合はマテビューを再作成するしかない。


マテビューの再作成

  • CERATE OR REPLACE〜がないため、DROP&再CREATEする。


マテビューとUNDO表領域

  • リフレッシュにはUNDO表領域を使用する。このため、大量データを頻繁にリフレッシュする設定にしていると、UNDO表領域がすぐにいっぱいになってしまう。(もし自動エクステンドONだったりすると、恐ろしい光景が見られます)


PL/SQL 西暦和暦変換 for Oracle10g

YYYYMMDD形式の日付をWYY.MM.DDに変換する関数。とりあえず書いたので貼っとく。CASE文はOracle9i以降対応らしいので注意。

ソース

CREATE OR REPLACE FUNCTION yyyy_to_wyy
(
  pDate IN NUMBER
)
RETURN VARCHAR2
IS
  cYear VARCHAR2(4);
  cMonth VARCHAR2(2);
  cDay VARCHAR2(2);
BEGIN
  cYear := SUBSTR(TO_CHAR(pDate),1,4);
  cMonth := SUBSTR(TO_CHAR(pDate),5,2);
  cDay := SUBSTR(TO_CHAR(pDate),7,2);

  CASE 
    WHEN pDate - 19890107 > 0 THEN
      RETURN 'H' || TO_CHAR(TO_NUMBER(cYear) + 1 - 1989) || '.' || cMonth || '.' || cDay;
    WHEN pDate - 19261224 > 0 THEN
      RETURN 'S' || TO_CHAR(TO_NUMBER(cYear) + 1 - 1926) || '.' || cMonth || '.' || cDay;
    WHEN pDate - 19120729 > 0 THEN
      RETURN 'T' || TO_CHAR(TO_NUMBER(cYear) + 1 - 1912) || '.' || cMonth || '.' || cDay;
    ELSE
      RETURN 'M' || TO_CHAR(TO_NUMBER(cYear) + 1 - 1868) || '.' || cMonth || '.' || cDay;
  END CASE;
END;

使い方

SELECT YYYY_TO_WYY(20070829) FROM DUAL
→"H19.8.29"