セカイモンの裏側

★毎週木曜日更新★ 海外ショッピングサイト『セカイモン』のブログです。私たちスタッフの仕事風景や日々の出来事など、     “セカイモンの舞台裏”とも言える日常を綴っていきます。

オラクルのパフォーマンスチューニング データを削減するについて

オラクルのDBのOSのロードアベレージが高くなっているので、サポートに問い合わせてみた。

 

[問合せ内容や障害の詳細]

現在稼働中のWEBサービスでアクセスするテーブル(インデックス設定あり/パーティション設定なし)でデータ量が***万件近くあり、テーブル検索に対するパフォーマンスが低い状態を改善しようと考えています。
データを別DBに退避し、データを20%位残して残りをDELETEでデータ削除した場合、パフォーマンスの向上は見込めるのでしょうか?
ネットでいろいろ調べた結果、データを消しても断片化が改善されないとあまり効果がでないような事も書いてありました。
できればサービスを停止せずに対応したいです。
ご回答よろしくお願い致します。

[回答]
先のご質問ですが、DELETEのみでは断片化や表の肥大化は解消できないため、こちらのみで
パフォーマンスの向上は難しい状況です。
こちらの対応に関しては以下の2点を実行いただくことで断片化や表の肥大化の解消になりますので
対応可能と判断しております。

・表のMOVE
・索引のrebuild

表のMOVEについては以下のように実行することになります。

SQL> alter table <表名> move;

*表領域名を省略した場合、デフォルト表領域に移動します。
もし明示的に指定する場合は以下のようになります。

SQL> alter table <表名> move tablespace <表領域名>;

上記を実行した場合の注意点として索引が使用不可になる点、実行中insert等の処理ができない
状態となりますので、該当表にアクセスが無い時間帯に行っていただくようお願いいたします。

また、索引が使用不可になった場合の対処として先に記載した索引のrebuildが必要となります。
索引のrebuildは以下のように実施いただくことになります。

SQL> alter index <索引名> rebuild;

上記実行中もinsert等の処理ができない状態となりますので、該当表にアクセスが無い時間帯
に行っていただくようお願いいたします。


以上、ご確認の程、どうぞよろしくお願いいたします。

 

[質問2]
回答ありがとうございます。
ご提案頂いた2点の対応で検討します。

ただ、DELETEしてからの作業となるかと思いますが、
所要時間はTOTALでどのくらいかかりますか?

データ件数:400万件→80万件
INDEX数:15

数分で終わるのか、1時間くらいか、またはそれ以上か大体の目安を教えて頂きたいです。


[回答2]
上記ですが、大変恐れ入りますが、実データ量や、Oracleのメモリ等の設定、マシンのIOや
CPU等のスペックなど様々な要素に左右されるものであるため、一概にどの程度の時間が
かかるといったような机上の計算は困難であり、目安等を提示することも難しいものと
なります。

こちらを確認するのであれば同様のスペックの環境に同様の表を作成し、実行し時間を
確認頂く以外に方法は無いものとなります。

ご期待に沿う回答とならず、大変恐縮ではございますが、何卒ご了承頂きます様お願い
いたします。

ちなみに、私の手元の環境では、数万件程の表で、索引が一つしかない状況ですが、
数分で終了しております。
そのため、先の様な点もあるため、一概に申し上げることはできませんが、1時間ほどでは
完了できる可能性があると考えております。

以上、ご確認の程、どうぞよろしくお願いいたします。

 

select segment_name, bytes, ROUND(bytes / 1024 / 1024 / 1024,2) AS GB from user_segments order by bytes desc

これでどのテーブルがどれくらいサイズがあるのかを確認

700万件程度のテーブルをdeleteしても予想通りサイズは変わらずselect文でも1行しかないのに20秒ぐらいかかった。

alter move, index rebuildで予想通りselect文も早くなったのでやはり効果はありかと。