備忘録

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

データ0件なのに検索が遅い

ブログに始めてのコメントがあったので、久しぶりに再会。

開発環境で0件なのにSELECTが遅いことがあったので、結果はほぼ想像できていたが調べてみた。

  1. V$SQLから遅いSQLのSQLIDを探す

  2. SELECT a.SQL_ID, a.SQL_TEXT, a.* FROM V$SQL a WHERE a.SQL_TEXT LIKE '%なんたら%';


  3. 実行計画を見る

  4. SELECT * FROM TABLE(DBMS_XPLAN.DISPLAY_CURSOR('見つけたSQL_ID'));


  5. 使っているオブジェクトがぶっ壊れていないか調べる

  6. SELECT a.STATUS, a.* FROM ALL_OBJECTS a WHERE a.OBJECT_NAME = 'テーブル名なりインデックス名';


  7. セグメントのサイズを調べる
  8. SELECT TRUNC(a.BYTES/1024/1024/1024, 2) "サイズ(GB)", a.* FROM DBA_SEGMENTS a WHERE a.SEGMENT_NAME = 'テーブル名なりインデックス名';


    0件なのにデカイことがここでわかる。

無駄にデカイからFULL SCAN時にそのセグメントを舐め回さないといけないから遅かった。
なぜでかいか?マニュアルのこの辺りを見ると良いかと。

  • オンラインでセグメントを縮小する方法の詳細は、『Oracle Database管理者ガイド』を参照してください。

  • TRUNCATE TABLEの構文およびセマンティクスについては、『Oracle Database SQL言語リファレンス』を参照してください。


再編成かtruncateをせよってこと。
開発環境のユーザにDROP TABLE権限がなく、TRUNCATEができなかったからセグメントが広がりっぱなしだったんでしょう。
DROP TABLE権限をつけるのは躊躇するだろうから、TRUNCATE権限っていうのがあれば良いんだけどね。

FC2Ad

上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。