【DB】ORACLE 仮想列(VirtualColumn)

いまさらだがORACLEの仮想列を使ってみた。

リンク

参考 Oracle Database 11g : DBAと開発者のための主要な新機能

実践

以下のようなテーブルがある。

-- 仮想列の追加
ALTER TABLE TRANSACTION1 ADD ( NAME2 AS (NAME || '-' || KBN) ) ;

仮想列を追加する。
するとテーブルが以下のようになる。

仮想列にはインデックスもつけれるらしい。

インデックスをつける前に最近覚えた実行計画を見てみる。

-- カウントを取得
SELECT COUNT(*) FROM TRANSACTION1 WHERE NAME2 = 'AAA-KBN001';

テーブルアクセスがFULLになっていることがわかる。
インデックスをつけてみる。

-- インデックスを作成
CREATE INDEX TRANSACTION1_NAME2_INDEX ON TRANSACTION1(NAME2);

再度実行計画を見てみると・・・・

RANGE SCANになりました\(^o^)/
 

今回使ったSQL

-- 仮想列の追加
ALTER TABLE TRANSACTION1 ADD ( NAME2 AS (NAME || '-' || KBN) ) ;

-- 仮想列の削除
ALTER TABLE TRANSACTION1 DROP COLUMN NAME2 ;

-- インデックスを作成
CREATE INDEX TRANSACTION1_NAME2_INDEX ON TRANSACTION1(NAME2);

-- インデックスを削除
DROP INDEX TRANSACTION1_NAME2_INDEX;

-- カウントを取得
SELECT COUNT(*) FROM TRANSACTION1 WHERE NAME2 = 'AAA-KBN001';

 

おまけ

GeneXusから仮想列を参照することも可能です。
トランザクションに項目追加して再編成を走らせないようにすれば問題なく参照できます。

ただし更新しようとするとDBエラーになるので注意ですw


 
 

まとめ

GeneXusの式項目(Formula)で実装したいけどレスポンスが遅い
けどViewにするともっと遅いときに便利だと思います。
ただしロジックがテーブルにあったりPGにあったりで管理がめんどうになりそう・・・・

以上です。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください