仮想ハードディスクサイズを縮小する
VirtualPCではファイルが使用している領域が削除後も開放されず、結果として仮想ハードディスクファイルのサイズが肥大していく。この現象を解消するために、手動でハードディスクファイルを縮小する必要がある。
以下の処理により13GBが7GB程度に縮小できた。
環境
- ホストOS Windows2003 Server
- ゲストOS WindowsXP
- Microsoft Virtual PC 2007
手順
- ゲストOSでデフラグ
- ゲストOSで圧縮前処理
- 仮想ハードディスク圧縮処理
ゲストOSで圧縮前処理
デフラグで空いた領域に0データを書きこむ処理。これにより圧縮処理時に領域を削除してくれるようになる。
- ホストOSにてVirtualPCをインストールしたフォルダ内にあるVirtual Disk Precompactor.isoファイルを探す。
例)\Microsoft Virtual PC\Virtual Machine Additions\以下 - 圧縮対象のゲストOSでVirtuaPCを起動する
- VirtualPC上のメニューバーにて「CD」→「ISOイメージのキャプチャ」を選択し、[1]で確認したisoファイルを指定する。
- ゲストOS上のCDドライブに、Virtual Disk Precompactorがマウントされる。ダブルクリックで起動。
2008.07.11追記:ゲストOSがVistaの場合は、右クリック→「管理者として実行」する。 - 圧縮前処理が開始する。終了時にメッセージが表示される。
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 );
■
20071205
Oracle10g マテリアライズド・ビュー(実践)
ノウハウはいいから今すぐマテビューを作りたい人向け。
- 権限付与
- ログ作成
- マテビュー作成
権限付与 他→自(マスタ所持者≠ビュー所持者=作成者)
GRANT CREATE MATERIALIZED VIEW TO [作成者]; GRANT SELECT ON [マスタ所持者].[マスタテーブル名] TO [作成者];
同様にCREATE TABLE,CREATE VIEW,CREATE INDEXも必要。
ログ作成
CREATE MATERIARIZED VIEW LOG ON [マスタテーブル名];
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だったりすると、恐ろしい光景が見られます)
参考
- Oracle10g 10.2 SQLリファレンス
- Oracle10g データウェアハウスガイド(※入手には会員登録が必要)
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"