oracle in-database-archiving ~oracleでの論理削除~

30
Oracle でででででで @mogmet 2016/05/10 Database Connect 2016

Upload: daiki-mogmet-ito

Post on 16-Apr-2017

1.501 views

Category:

Engineering


1 download

TRANSCRIPT

Page 1: Oracle In-database-archiving ~Oracleでの論理削除~

Oracle での論理削除@mogmet

2016/05/10 Database Connect 2016

Page 2: Oracle In-database-archiving ~Oracleでの論理削除~

About me• twitter: @mogmet• 好物: iOS, php, MySQL, Oracle• 仕事:インフラエンジニア→ iOS エンジニア→フリーランスな DBA• ブログとか: http://mogmet.com/• 作ったアプリたち↓

ワンナイト人狼 for iPhone STARBUCKSHOLIC

はじめての Oracle の発表です

Page 3: Oracle In-database-archiving ~Oracleでの論理削除~

論理削除戦争

Page 4: Oracle In-database-archiving ~Oracleでの論理削除~

#ronsakucasual DB の論理削除についてひたすら共有する 論理削除 Casual Talks #1 にいってきたまとめ

http://blog.mogmet.com/ronsakucasual-1/

様々な方法の参考

Page 5: Oracle In-database-archiving ~Oracleでの論理削除~

考えに考え、結果、削除フラグを採用することになった皆さんへ朗報です

Page 6: Oracle In-database-archiving ~Oracleでの論理削除~

12c 新機能In-Database Archiving (インデータベース・アーカイブ)

Page 7: Oracle In-database-archiving ~Oracleでの論理削除~

これを使うと論理削除をOracle の機能として実現できる!

Page 8: Oracle In-database-archiving ~Oracleでの論理削除~

有効にするにはALTER TABLE <table_name> ROW ARCHIVAL;を実行するだけ!

※ 新規の時は table を作る時に ROW ARCHIVAL をつけるだけ。

Page 9: Oracle In-database-archiving ~Oracleでの論理削除~

有効化するとORA_ARCHIVE_STATEという非表示の varchar2 型の列が追加されるのでそれを削除フラグとして使う

Page 10: Oracle In-database-archiving ~Oracleでの論理削除~

SQL> create table anohana(id number, name varchar(32)) row archival;

Table created.

Page 11: Oracle In-database-archiving ~Oracleでの論理削除~

SQL> insert into anohana values (1, 'jintan');

1 row created.

SQL> insert into anohana (id, name, ORA_ARCHIVE_STATE) values (2, 'menma', 1);

1 row created.

SQL> commit;

Commit complete.

Page 12: Oracle In-database-archiving ~Oracleでの論理削除~

SQL> select * from anohana;

ID NAME---------- --------------------

1 jintan

Page 13: Oracle In-database-archiving ~Oracleでの論理削除~

menma が見当たらない!

Page 14: Oracle In-database-archiving ~Oracleでの論理削除~

魔法のコトバを唱える

Page 15: Oracle In-database-archiving ~Oracleでの論理削除~

SQL> ALTER SESSION SET ROW ARCHIVAL VISIBILITY = ALL;

Page 16: Oracle In-database-archiving ~Oracleでの論理削除~

SQL> select * from anohana;

ID NAME---------- --------------------

1 jintan 2 menma

Page 17: Oracle In-database-archiving ~Oracleでの論理削除~

見つかっちゃった(๑ゝڡ ๑◕)

Page 18: Oracle In-database-archiving ~Oracleでの論理削除~

In-Database Archiving を有効にしたテーブルに対して実行計画をとってみると

Page 19: Oracle In-database-archiving ~Oracleでの論理削除~

実行計画をみると SQL が自動的に付与されていたのがわかる-----------------------------------------------------------------------------| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |-----------------------------------------------------------------------------| 0 | SELECT STATEMENT | | 1 | 2033 | 3 (0)| 00:00:01 ||* 1 | TABLE ACCESS FULL| ANOHANA | 1 | 2033 | 3 (0)| 00:00:01 |-----------------------------------------------------------------------------

Predicate Information (identified by operation id):---------------------------------------------------

1 - filter("ANOHANA"."ORA_ARCHIVE_STATE"='0' AND "ID"<3)

-----------------------------------------------------------------------------| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |-----------------------------------------------------------------------------| 0 | SELECT STATEMENT | | 2 | 62 | 3 (0)| 00:00:01 ||* 1 | TABLE ACCESS FULL| ANOHANA | 2 | 62 | 3 (0)| 00:00:01 |-----------------------------------------------------------------------------

Predicate Information (identified by operation id):---------------------------------------------------

1 - filter("ID"<3)

ALTER SESSION SET ROW ARCHIVAL VISIBILITY = ALL;

SELECT * FROM anohana WHERE id < 3;

SELECT * FROM anohana WHERE id < 3;

Page 20: Oracle In-database-archiving ~Oracleでの論理削除~

Tips

Page 21: Oracle In-database-archiving ~Oracleでの論理削除~

インデータベースアーカイブが有効( VISIBILITY = ACTIVE )な時にORA_ARCHIVE_STATE を条件にいれて

SELECT しても全くデータがでないので注意!

Page 22: Oracle In-database-archiving ~Oracleでの論理削除~

SQL> SELECT * FROM anohana WHERE ORA_ARCHIVE_STATE = 1;

no rows selected

SQL> ALTER SESSION SET ROW ARCHIVAL VISIBILITY = ALL;

Session altered.

SQL> SELECT * FROM anohana WHERE ORA_ARCHIVE_STATE = 1;

ID NAME---------- --------------------

2 menma

Page 23: Oracle In-database-archiving ~Oracleでの論理削除~

CHECK 制約をORA_ARCHIVE_STATEに追加することもできます!

Page 24: Oracle In-database-archiving ~Oracleでの論理削除~

SQL> ALTER TABLE anohana ADD CONSTRAINT check_state CHECK (ora_archive_state IN ('1', '0'));

Table altered.

Page 25: Oracle In-database-archiving ~Oracleでの論理削除~

SQL> INSERT INTO anohana (id, name, ORA_ARCHIVE_STATE) VALUES (1, 'yukiatsu', 2);INSERT INTO anohana (id, name, ORA_ARCHIVE_STATE) VALUES (1, 'yukiatsu', 2)*ERROR at line 1:ORA-02290: check constraint (HOGE.CHECK_STATE) violated

Page 26: Oracle In-database-archiving ~Oracleでの論理削除~

まとめ

Page 27: Oracle In-database-archiving ~Oracleでの論理削除~

まとめ• 論理削除を実装する際にはインデータベース・アーカイブを用いるとアプリの実装コストを下げられそう• varchar2 の型で ORA_ARCHIVE_STATE は使えるので使い方によっては様々な情報を工夫して入れられそう

Page 28: Oracle In-database-archiving ~Oracleでの論理削除~

One more thing…

Page 29: Oracle In-database-archiving ~Oracleでの論理削除~

個人的には DB 全般において論理削除を使う話になった時はもう少し詰めて設計を考えて、使わないで済むならその方がいいと思っている

Page 30: Oracle In-database-archiving ~Oracleでの論理削除~

御静聴ありがとうございました