いまさらだが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から仮想列を参照することも可能です。
トランザクションに項目追加して再編成を走らせないようにすれば問題なく参照できます。
まとめ
GeneXusの式項目(Formula)で実装したいけどレスポンスが遅い
けどViewにするともっと遅いときに便利だと思います。
ただしロジックがテーブルにあったりPGにあったりで管理がめんどうになりそう・・・・
以上です。