忍者ブログ

OracleDBAの技術メモ

最近物覚えが悪くなったので 仕事中に調べた後々役立つ情報をメモしております。

[PR]

×

[PR]上記の広告は3ヶ月以上新規記事投稿のないブログに表示されています。新しい記事を書く事で広告が消えます。

空白なのに空白でないセル【事件編】

(タイトルをコナン風にしてみた)

こんな不思議な現象が発生。
ググると一応同じような現象は検索できる。

(1)セルA1は未入力
(2)セルA2は”@”(アットマーク)を入力
(3)セルA3は未入力

(4)セルA1~A3を選択
(5)「現在選択されている範囲を並べ替える」で昇順並べ替えを実施
(6)【結果】”@”(アットマーク)はセルA1へ移動


(7)セルB1に以下の式で長さ0の文字列を入力
  =""
(8)セルB2は”@”(アットマーク)を入力
(9)セルB3は未入力

(10)セルB1~B3を選択
(11)「現在選択されている範囲を並べ替える」で昇順並べ替えを実施
(12)【結果】”@”(アットマーク)は移動せずB2のまま


(13)セルB1を選択してコピー(Ctl+C でも、メニューからでもなんでもよい)
(14)セルC1を選択し右クリック
(15)右クリックメニューから「形式を選択して貼り付け」を選択
(16)ダイアログから”値”を選択して”OK”を押下
(17)セルC2は”@”(アットマーク)を入力
(18)セルC2は未入力

(19)セルC1~C3を選択
(20)「現在選択されている範囲を並べ替える」で昇順並べ替えを実施
(21)【結果】”@”(アットマーク)は移動せずC2のまま


手順だけ読むと当たり前のように見えるが、
C1はExcel上はおろかVBAからオブジェクトとつたって行ってセルのValueプロパティで確認しても何も入っていない。
にも関わらず、ソートをかけると長さ0の文字列が入っているかのような動作となる。

これを意図してやっている場合には問題ないが、
不特定多数の人から送られてくるExcelシートに混入されると実に厄介だ。
ソートをする要件がなければいいが…
PR

セグメント使用率

Oracle8iのころには DBA_TABLES ディクショナリの
  「NUM_FREELIST_BLOCKS」
  「AVG_SPACE_FREELIST_BLOCKS」
を使用して詳細なセグメント使用率の算出が可能だったが、

Oracle9iからは自動セグメント管理導入されて主流となり、
FREELISTが使用されなくなってからは
「EMPTY_BLOCKS」等でHWMらしきものを確認するくらいしかできなくなってしまった。

いろいろ調べた結果、以前の詳細なセグメント使用率に近いものを算出するには

  「AVG_ROW_LEN」 × 「NUM_ROWS」

という方法しかなさそう。

参考:「Oracle9i物理設計 第5部 領域監視」
http://otndnld.oracle.co.jp/skillup/oracle9i/5_1/index.html#5_sql3

テーブルのDDL生成

SQL*Plusは接続できるけど諸事情によりファイル転送ができないような環境で
現在DB上にあるテーブルのDDLを取得したい場合
以下のコマンドにより取得可能。

SET LONG 2000000
SET PAGESIZE 0
SELECT DBMS_METADATA.GET_DDL('TABLE', 'TEST_TABLE', 'TESTUSER01') FROM DUAL;

構文は

DBMS_METADATA.GET_DDL('オブジェクトタイプ', 'オブジェクト名', 'スキーマ名')

詳しくはマニュアルからDBMS_METADATAパッケージの仕様を確認すること。

DDLの生成はテーブルに限らず他のオブジェクトでも可能。
例えば、表領域の場合は以下のようになる。
SELECT DBMS_METADATA.GET_DDL('TABLESPACE', 'USER01') FROM DUAL;

この場合は、当然ながらスキーマ名は不要となる。

値の種類の数を取得するSQL

SQLのチューニングの際に、カラムの値の種類の数を知りたい時があるけれど、
今までこんなSQLを書いてました。

SELECT COUNT(*) FROM (
SELECT DISTINCT TEST_TYPE FROM TEST_TABLE);


実はこっちの方がスマートでした。

SELECT COUNT(DISTINCT TEST_TYPE) FROM TEST_TABLE;

ただし、COUNTの中で”*”(アスタリスク)以外を指定した場合、NULLでない行数が戻されます。
つまり、NULLはカウントされないので注意です。
NULLも値の種類としてカウントしたい場合は、最初のSQLじゃないとだめですね。

統計情報収集-列統計オプション指定

統計情報を収集する際に列統計収集オプションを変更したい場合は ”method_opt” パラメータを指定する必要がある。

デフォルトでは
”FOR ALL COLUMNS SIZE AUTO”
だが、どうやら
”FOR ALL COLUMNS SKEWONLY”
が良いらしい。

なので、列統計収集オプションは ”SKEWONLY” に固定したスクリプトを作成。


begin
    DBMS_STATS.GATHER_TABLE_STATS(
        ownname => '&owner'
    ,   tabname => '&table'
    ,   method_opt => 'FOR ALL COLUMNS SKEWONLY'
    );
end;
/

列統計収集オプションの詳細はまた別途

ブログ内検索

プロフィール

HN:
宇佐 義男
性別:
男性
自己紹介:
都内で活動中のフリーエンジニア
最近はOracle DBに関する作業が主です。

カレンダー

04 2024/05 06
S M T W T F S
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31

最新CM

[08/06 Apagajid]
[06/23 Ajimehof]
[05/28 ovkftcz]
[05/20 Adeepen]
[05/13 Ajirubuy]

バーコード

P R

忍者アナライズ

免責事項

当ブログは日本オラクル株式会社 及びその子会社、関連会社とは一切関係ありません。 当ブログに記述の内容については、実際とは異なる場合があります。 記載しているコマンド、スクリプトを利用したことによって発生した問題、障害等については一切責任を負いません。 利用は自己責任にてお願い致します。