表題の通り、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を指定すると、ランダムな行サンプリングのかわりに、ランダムなブロック・サンプリングを実行できます。