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