忍者ブログ

OracleDBAの技術メモ

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

[PR]

×

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

値の種類の数を取得する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じゃないとだめですね。
PR

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

統計情報を収集する際に列統計収集オプションを変更したい場合は ”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;
/

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

枝番の最大値を取るようなSQL

テーブル定義:T_TEST

名前    NULL?    型
------ -------- -----------
ID     NOT NULL NUMBER(10)
SEQNO  NOT NULL NUMBER(10)


以下のようなSQLをよく作成する。

SELECT
    tst.id
,   tst.seqno
FROM t_test tst
WHERE tst.seqno = (
--
SELECT
    MAX(tstx.seqno)
FROM t_test tstx
WHERE tstx.id = tst.id
--
);



これは、IDに対して枝番の最大値を取得するSQLだが、 このSQLは以下のように変換できる。

SELECT
    tst.id
,   tst.seqno
FROM t_test tst
    INNER JOIN t_test tstx
        ON  tstx.id = tst.id
GROUP BY
    tst.id
,   tst.seqno
HAVING tst.seqno = max(tstx.seqno)
;


Oracle Databaseの実行計画なんかをみると上記のように内部で変換されていることがある。

サブクエリーとして親クエリーに埋め込む際は
Where句にそれぞれのIDに対する結合条件を記述してやるとよいと思われる。

~
(
SELECT
    tst.id
,   tst.seqno
FROM t_test tst
    INNER JOIN t_test tstx
        ON  tstx.id = tst.id
WHERE tst.id = [親クエリーのテーブル].id
  AND tstx.id = [親クエリーのテーブル].id
GROUP BY
    tst.id
,   tst.seqno
HAVING tst.seqno = max(tstx.seqno)
)
~


待機イベント-direct path read

待機イベント direct path read とは

バッファ・キャッシュを経由しない、マルチ・ブロック単位での読込時に発生する待機イベント。
主に、パラレルで Table Full Scan を実行時に発生する。

ただし、Oracle 11g 以降のバージョンでは、シリアルで Table Full Scan を行った場合にも、
バッファ・キャッシュのサイズに対し表のサイズが大きい際に使用されることがある。

参考
  ・Oracle DBA & Developer Dyas 2011 どこまでチューニングできるのか?最新Oracle Database 高速化手法
   [PDF]http://www.oracle.com/technetwork/jp/ondemand/db-technique/d-6-db11g-1484773-ja.pdf

ブログ内検索

プロフィール

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

忍者アナライズ

免責事項

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