ねら~ITエンジニア雑記

やきうのお兄ちゃんが綴るOracle Databaseメインのブログ

Oracle Database の SELECT文・SAMPLE句が、BLOCK句有り/無し で 読込量 が 全く異なる。

表題の通り、Oracle Database の SELECT文 の SAMPLE句が、
BLOCK句有り/無し で 読込量 が 全く違うんやで。知らんかった。。。彡(゚)(゚)

  • SAMPLE句無し の 場合
SET AUTOTRACE TRACEONLY;
SELECT /*+ FULL(A) CACHE(A) */ COUNT(*) FROM TEST_TABLE_A A;
:
Statistics
----------------------------------------------------------8841  consistent gets
          0  physical reads
:
  • SAMPLE句有り、BLOCK句無し の場合
SET AUTOTRACE TRACEONLY;
SELECT /*+ FULL(A) CACHE(A) */ COUNT(*) FROM TEST_TABLE_A SAMPLE(1) A;
:
Statistics
----------------------------------------------------------8702  consistent gets ★SAMPLE句無しと余り変わらない。
          0  physical reads
:
  • SAMPLE句有り、BLOCK句有り の場合
SET AUTOTRACE TRACEONLY;
SELECT /*+ FULL(A) CACHE(A) */ COUNT(*) FROM TEST_TABLE_A SAMPLE BLOCK(1) A;
:
Statistics
----------------------------------------------------------144  consistent gets ★ブロック読込量が圧倒的に少ない。
          0  physical reads
:

まとめると

 ・BLOCK句無しのSAMPLE句の動作
  ⇒ テーブルを全ブロック読み込んで、そこからレコードをサンプリングして返す。

 ・BLCOK句有りのSAMPLE句の動作
  ⇒ テーブルを読む段階でブロックをサンプリングして(絞り込んで)、
   絞り込んだブロックのレコードを返す。

と云う動作になるんやね彡(゚)(゚)

ちな BLOCK句付きのSAMPLEは、今回対象にした表では件数のバラ付きが多かったです。

SELECT /*+ FULL(A) CACHE(A) */ COUNT(*) FROM TEST_TABLE_A SAMPLE BLOCK(1) A;

  COUNT(*)
----------
     37197

SQL> /

  COUNT(*)
----------
    111963

SQL> /

  COUNT(*)
----------
     37197

SQL> /

  COUNT(*)
----------
     74462

マニュアルは下記の通りやで彡(゚)(゚)

Oracle Database SQL言語リファレンス 11gリリース2 (11.2) B56299-08
http://docs.oracle.com/cd/E16338_01/server.112/b56299/statements_10002.htm#i2065953
BLOCKを指定すると、ランダムな行サンプリングのかわりに、ランダムなブロック・サンプリングを実行できます。

Qiitaにも書いたやで彡(^)(^)

Oracle Database の SELECT文・SAMPLE句が、BLOCK句有り/無し で 読込量 が 全く異なる。
http://qiita.com/ora_gonsuke777/items/7b56826a439f3487b12f