LoginSignup
3
1

More than 5 years have passed since last update.

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

Last updated at Posted at 2016-09-13

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

3
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
1