��PostgreSQL����ե����2025��11��21�����š������å��������
¾�ΥС�������ʸ�� �� 17 | 16 | 15 | 14 | 13 | 12 | 11 | 10 | 9.6 | 9.5 | 9.4 | 9.3 | 9.2 | 9.1 | 9.0 | 8.4 | 8.3 | 8.2 | 8.1 | 8.0 | 7.4 | 7.3 | 7.2

57.1. �Կ������

�ʲ������PostgreSQL�ꥰ��å�����ǡ����١�����Υơ��֥����Ѥ��ޤ��� ɽ���������ϤϥС������8.3�Ǽ������ޤ����� �����Ρʤޤ��ϰʹߤΡ˥С������Ȥ�ư��Ѥ�äƤ��뤫�⤷��ޤ��� �ޤ���ANALYZE�����׾��������������˥�����ʥ���ץ�󥰤�Ԥ��ޤ��Τǡ���̤�ANALYZE�򿷤����Ԥä����¿���Ѥ�뤳�Ȥ����դ��Ƥ���������

���˴�ñ���䤤��碌����Ϥ�ޤ��礦��

EXPLAIN SELECT * FROM tenk1;

                         QUERY PLAN
-------------------------------------------------------------
 Seq Scan on tenk1  (cost=0.00..458.00 rows=10000 width=244)

�ץ��ʤ��ɤΤ褦��tenk1��ǻ�٤���ꤹ�뤫�ˤĤ��Ƥ�項14.2���������ޤ����� �������������Ǵ����ˤʤ�褦�˷����֤��������ޤ��� �ڡ���������ӹԿ���pg_class���鸡������ޤ���

SELECT relpages, reltuples FROM pg_class WHERE relname = 'tenk1';

 relpages | reltuples
----------+-----------
      358 |     10000

�������ͤϺǸ�ˤ��Υơ��֥��VACUUM�ޤ���ANALYZE��Ԥä������Τ�ΤǤ��� �ץ��ʤϤ��θ塢�ơ��֥���μºݤΥڡ���������Ф��ޤ��ʤ���ϥơ��֥륹������Ԥ�ʤ��²������Ǥ��ˡ� relpages�Ȱۤʤ��硢reltuples�ϸ��ߤο���Կ���ã����ޤ����礵��ޤ��� ���ξ�硢����Ԥ�reltuples��Ʊ���Ǥ��Τǡ��ͤ����ΤǤ���

����WHERE����ϰϾ��������˿ʤߤޤ��礦��

EXPLAIN SELECT * FROM tenk1 WHERE unique1 < 1000;

                                   QUERY PLAN
--------------------------------------------------------------------------------
 Bitmap Heap Scan on tenk1  (cost=24.06..394.64 rows=1007 width=244)
   Recheck Cond: (unique1 < 1000)
   ->  Bitmap Index Scan on tenk1_unique1  (cost=0.00..23.80 rows=1007 width=0)
         Index Cond: (unique1 < 1000)

�ץ��ʤ�WHERE��ξ��򸡺�����pg_operator���<�黻���Ѥ������ٴؿ��򸡺����ޤ��� �����oprrest����ݻ�����ޤ��� �������ǤϤ��ι��scalarltsel�Ǥ��� scalarltsel�ؿ��ϡ�pg_statistics����unique1���ٿ�ʬ�ۤ���Ф��ޤ��� ���Ȥ��䤤��碌����ϡ����ñ���pg_stats�ӥ塼�򸡺�����������ñ�Ǥ���

SELECT histogram_bounds FROM pg_stats
WHERE tablename='tenk1' AND attname='unique1';

                   histogram_bounds
------------------------------------------------------
 {0,993,1997,3050,4040,5036,5957,7057,8029,9016,9995}

���ˡ�"< 1000"���������ٿ�ʬ��Ψ����Ф��ޤ��� ���줬�����٤Ǥ��� �����ٿ�ʬ�ۤϡ��ϰϤ������٤ΥХ��åȤ�ʬ�䤷�ޤ��� �Ǥ��Τǡ��Ԥ�ʤ���Фʤ�ʤ����Ȥϡ��ͤ�����Х��åȤ򸫤Ĥ���������ʬ�ȡ��������ˤ���Х��å�����������뤳�Ȥ����Ǥ��� 1000�Ȥ����ͤ����餫��2���ܤΥХ��åȡ�993 - 1997�ˤˤ���ޤ��� ���äơ��ͤ��ƥХ��åȤ����������ʬ�ۤ��Ƥ���Ȳ��ꤹ��ȡ������٤�ʲ��Τ褦�˷׻����뤳�Ȥ��Ǥ��ޤ���

selectivity = (1 + (1000 - bucket[2].min)/(bucket[2].max - bucket[2].min))/num_buckets
            = (1 + (1000 - 993)/(1997 - 993))/10
            = 0.100697

�Ĥޤꡢ1�ĤΥХ��å����Τˡ�2���ܤΥХ��åȤȤ�������Ψ��ä�����Τ򡢥Х��åȿ��dz�ä���ΤȤʤ�ޤ��� �����ǡ��Ԥο����ͤϡ������٤�tenk1��ǻ�٤�ݤ���碌����ΤȤ��Ʒ׻�����ޤ���

rows = rel_cardinality * selectivity
     = 10000 * 0.100697
     = 1007  (rounding off)

���ˡ�WHERE�����������������Ƥ���Ƥߤޤ��礦��

EXPLAIN SELECT * FROM tenk1 WHERE stringu1 = 'CRAAAA';

                        QUERY PLAN
----------------------------------------------------------
 Seq Scan on tenk1  (cost=0.00..483.00 rows=30 width=244)
   Filter: (stringu1 = 'CRAAAA'::name)

�����֤��ޤ������ץ��ʤ�WHERE��ξ��򸡺�����=�Ѥ������ٴؿ������ξ���eqsel�򸡺����ޤ��� �������ο���Ǥϡ��ٿ�ʬ�ۤ����Ω���ޤ��� ����ˡ������٤η���ˤ���������MCV�ˤΥꥹ�Ȥ����Ѥ���ޤ��� MCV�򸫤Ƥߤޤ��礦�� ���ͭ�Ѥˤʤ��󤬤����Ĥ�����ޤ���

SELECT null_frac, n_distinct, most_common_vals, most_common_freqs FROM pg_stats
WHERE tablename='tenk1' AND attname='stringu1';

null_frac         | 0
n_distinct        | 676
most_common_vals  | {EJAAAA,BBAAAA,CRAAAA,FCAAAA,FEAAAA,GSAAAA,JOAAAA,MCAAAA,NAAAAA,WGAAAA}
most_common_freqs | {0.00333333,0.003,0.003,0.003,0.003,0.003,0.003,0.003,0.003,0.003}

CRAAAA��MCV�Υꥹ����ˤ���ޤ��Τǡ������٤�ñ�˺����١�MCF�ˤΥꥹ������б�������ܤˤʤ�ޤ���

selectivity = mcf[3]
            = 0.003

����Ʊ�͡����ꤵ���Կ���ñ������Ʊ�͡������ͤ�tenk1��ǻ�٤Ȥ��ѤǤ���

rows = 10000 * 0.003
     = 30

�����ǡ�Ʊ���䤤��碌�򸫤Ƥߤޤ��� ������������������MCV��ˤ���ޤ���

EXPLAIN SELECT * FROM tenk1 WHERE stringu1 = 'xxx';

                        QUERY PLAN
----------------------------------------------------------
 Seq Scan on tenk1  (cost=0.00..483.00 rows=15 width=244)
   Filter: (stringu1 = 'xxx'::name)

�ͤ�MCV�ΰ������ʤ���硢�����٤�ɤΤ褦�˿��ꤹ�뤫���礭���ۤʤ�ޤ��� �ͤ������ˤʤ����˻��Ѥ������ˡ�ϡ�MCV���٤Ƥ����٤˴ؤ����μ����Ȥ߹�碌����ΤǤ���

selectivity = (1 - sum(mvf))/(num_distinct - num_mcv)
            = (1 - (0.00333333 + 0.003 + 0.003 + 0.003 + 0.003 + 0.003 +
                    0.003 + 0.003 + 0.003 + 0.003))/(676 - 10)
            = 0.0014559

�ĤޤꡢMCV�����٤򤹤٤�­����碌����Τ�1���麹�������������ơ�����¾�������ͤο��ǽ������ޤ��� ����ϡ�MCV�ʳ�����γ��ϡ�����¾�θ����ͤ��٤Ƥ��Ϥäư��ͤ�ʬ�ۤ��Ƥ��뤳�Ȥ�����Ȥ��Ƥ��뤳�Ȥˤʤ�ޤ��� NULL�ͤ�¸�ߤ��ʤ����ᡢ������θ����ɬ�פ��ʤ����Ȥ����դ��Ƥ��������� �ʤ���ʤ��С�ʬ�Ҥ���Ʊ�ͤ�NULL�γ��򺹤��������Ȥˤʤ�ޤ����� ����Կ��ϰʲ��Τ褦�����̤˷׻�����ޤ���

rows = 10000 * 0.0014559
     = 15  (rounding off)

���Ҥ�unique1 < 1000����Ѥ������scalarltsel�������ϲ���Ԥ����ˤĤ��ơ�ñ�㲽����������ΤǤ����� �����ޤǤǡ�MCV����Ѥ�����򸫤Ƥ��ޤ����Τǡ�¿���ܺ٤���Ƥ󤹤뤳�Ȥ��Ǥ��ޤ��� unique1�ϰ�դ���Ǥ��뤿�ᡢMCV��¸�ߤ��ޤ���ʤ����ͤ�¾���ͤ�Ʊ���Ȥʤ뤳�Ȥ��ʤ����Ȥ����ΤǤ��ˤΤǡ���Ϸ׻����Τ����Τʤ�ΤǤ����� ��դǤϤʤ���Ǥϡ��̾��ٿ�ʬ�ۤ�MCV�ꥹ�Ȥ�ξ����¸�ߤ��ޤ��� �����ơ��ٿ�ʬ�ۤϡ�MCV��ɽ��������콸�Ĥΰ��֤�ޤߤޤ��� ������Τʿ����Ԥ����Ȥ��Ǥ��뤿�ᡢ������ˡ��Ԥ��ޤ��� ���ξ����Ǥϡ�scalarltsel��ľ�ܾ����㤨��"< 1000"�ˤ�MCV�ꥹ�Ȥγ��ͤ�Ŭ�Ѥ�������������MCV�����٤�­����碌�ޤ��� ���줬MCV�Υơ��֥���ʬ�ˤ��������Τʿ��������٤Ǥ��� ���θ��ٿ�ʬ�ۤ����Ʊ�ͤ˻Ȥ�졢MCV�ʳ��Υơ��֥���ʬ�ˤ����������٤���ꤷ�ޤ��� �����Ƥ���2�Ĥ��ͤ��Ȥ߹�碌�ơ����Τ������٤���ꤷ�ޤ��� �㤨�С��ʲ���Ƥ���ޤ���

EXPLAIN SELECT * FROM tenk1 WHERE stringu1 < 'IAAAAA';

                         QUERY PLAN
------------------------------------------------------------
 Seq Scan on tenk1  (cost=0.00..483.00 rows=3077 width=244)
   Filter: (stringu1 < 'IAAAAA'::name)

���Ǥ�stringu1��MCV����ϳ�ǧ���Ƥ��ޤ��Τǡ������Ǥ��ٿ�ʬ�ۤ򸫤Ƥߤޤ���

SELECT histogram_bounds FROM pg_stats
WHERE tablename='tenk1' AND attname='stringu1';

                                histogram_bounds
--------------------------------------------------------------------------------
 {AAAAAA,CQAAAA,FRAAAA,IBAAAA,KRAAAA,NFAAAA,PSAAAA,SGAAAA,VAAAAA,XLAAAA,ZZAAAA}

MCV�ꥹ�Ȥ򸡺�����ȡ�stringu1 < 'IAAAAA'������Ƭ��6���ܤ��������졢�Ǹ��4���ܤ���������ʤ����Ȥ��狼��ޤ��� �Ǥ��Τǡ��콸�Ĥ�MCV��ʬ�ˤ����������٤ϰʲ��Τ褦�ˤʤ�ޤ���

selectivity = sum(relevant mvfs)
            = 0.00333333 + 0.003 + 0.003 + 0.003 + 0.003 + 0.003
            = 0.01833333

MCF�����¤Ϥޤ���MCV��ɽ������콸�Ĥι�׳�礬0.03033333�Ǥ��ꡢ�������ä��ٿ�ʬ�ۤ�ɽ������礬0.96966667�Ǥ��뤳�Ȥ��狼��ޤ��� �ʷ����֤��ޤ�����NULL��¸�ߤ��ޤ��󡣤⤷¸�ߤ�����Ϥ����ǽ������ʤ���Фʤ�ޤ��󡣡� IAAAAA�Ȥ����ͤ�3���ܤΥХ��åȤν�ü���դˤʤ뤳�Ȥ��ǧ���뤳�Ȥ��Ǥ��ޤ��� �ۤʤ�ʸ�������٤ˤĤ���¿���¤äݤ��������Ѥ���ȡ��ץ��ʤ�IAAAAA��꾮�����콸�Ĥ��ٿ�ʬ�ۤ���ʬ�ο����ͤ�0.298387�ˤʤ�ޤ��� ������MCV����MCV�콸�ĤˤĤ��Ƥο����ͤ��Ȥ߹�碌�ޤ���

selectivity = mcv_selectivity + histogram_selectivity * histogram_fraction
            = 0.01833333 + 0.298387 * 0.96966667
            = 0.307669

rows        = 10000 * 0.307669
            = 3077  (rounding off)

���ʬ�ۤ����ʤ�ʿó�Ǥ��Τǡ������������ˤ�����MCV�ꥹ�Ȥˤ�������Ϥ��ʤ꾮���ʤ�ΤǤ��� �ʤ�����������ͤ�¾����ѽФ����Τȼ������׾���ϤۤȤ�ɥ���ץ�󥰥��顼�ˤ��ޤ����� ������Ū�ʡ��������ͤ�¾�������¿���ѽФ�����Ǥϡ������ͤ��Ф��������٤����Τ˸��Ф���ޤ��Τǡ�����ʣ���ʽ����ˤ�����٤����ɤ���ޤ���

����WHERE���ʣ���ξ�����ľ���Ƥ���ޤ��礦��

EXPLAIN SELECT * FROM tenk1 WHERE unique1 < 1000 AND stringu1 = 'xxx';

                                   QUERY PLAN
--------------------------------------------------------------------------------
 Bitmap Heap Scan on tenk1  (cost=23.80..396.91 rows=1 width=244)
   Recheck Cond: (unique1 < 1000)
   Filter: (stringu1 = 'xxx'::name)
   ->  Bitmap Index Scan on tenk1_unique1  (cost=0.00..23.80 rows=1007 width=0)
         Index Cond: (unique1 < 1000)

�ץ��ʤ�2�Ĥξ�郎��Ω���Ƥ���Ȳ��ꤷ�ޤ��� ���Τ��ᡢ�ġ��ζ�������٤��ݤ���蘆��ޤ���

selectivity = selectivity(unique1 < 1000) * selectivity(stringu1 = 'xxx')
            = 0.100697 * 0.0014559
            = 0.0001466

rows        = 10000 * 0.0001466
            = 1  (rounding off)

�ӥåȥޥåץ���ǥå����������ˤ���֤�����Τȿ��ꤵ���Կ��ϡ�����ǥå����ǻ��Ѥ������Τߤ�ȿ�Ǥ��뤳�Ȥ����դ��Ƥ��������� ��³�Υҡ��׼��Ф��Υ����ȿ���˱ƶ����ޤ��Τǡ�����Ͻ��פǤ���

�Ǹ�ˡ�����ޤ��䤤��碌�򸫤Ƥߤޤ��礦��

EXPLAIN SELECT * FROM tenk1 t1, tenk2 t2
WHERE t1.unique1 < 50 AND t1.unique2 = t2.unique2;

                                      QUERY PLAN
--------------------------------------------------------------------------------------
 Nested Loop  (cost=4.64..456.23 rows=50 width=488)
   ->  Bitmap Heap Scan on tenk1 t1  (cost=4.64..142.17 rows=50 width=244)
         Recheck Cond: (unique1 < 50)
         ->  Bitmap Index Scan on tenk1_unique1  (cost=0.00..4.63 rows=50 width=0)
               Index Cond: (unique1 < 50)
   ->  Index Scan using tenk2_unique2 on tenk2 t2  (cost=0.00..6.27 rows=1 width=244)
         Index Cond: (unique2 = t1.unique2)

tenk1 "unique1 < 50"�˴ؤ������¤�������Ҿ��롼�׷�������ɾ������ޤ��� ����ϡ������ϰϤ˴ؤ������Ʊ�ͤ˰����ޤ��� ���������������50��unique1�ٿ�ʬ�ۤκǽ�ΥХ��åȤˤ���ޤ��Τǡ��ʲ��Τ褦�ˤʤ�ޤ���

selectivity = (0 + (50 - bucket[1].min)/(bucket[1].max - bucket[1].min))/num_buckets
            = (0 + (50 - 0)/(993 - 0))/10
            = 0.005035

rows        = 10000 * 0.005035
            = 50  (rounding off)

�������¤�t2.unique2 = t1.unique2�Ǥ��� �黻�ҤϤ褯���Ѥ���ñ�ʤ�=�Ǥ����������ٴؿ���pg_operator��oprjoin�󤫤����ꤵ�졢eqjoinsel�Ȥʤ�ޤ��� eqjoinsel��tenk2�����tenk1��ξ�������׾���򸡺����ޤ���

SELECT tablename, null_frac,n_distinct, most_common_vals FROM pg_stats
WHERE tablename IN ('tenk1', 'tenk2') AND attname='unique2';

tablename  | null_frac | n_distinct | most_common_vals
-----------+-----------+------------+------------------
 tenk1     |         0 |         -1 |
 tenk2     |         0 |         -1 |

����ξ�硢���٤Ƥ��ͤ���դǤ��뤿�ᡢunique2�˴ؤ���MCV���󤬤���ޤ��� �Ǥ��Τǡ�ξ��졼�����θ����Ϳ���NULL�ͤ���ʬ�Τߤ˰�¸�������르�ꥺ�����Ѥ��뤳�Ȥ��Ǥ��ޤ���

selectivity = (1 - null_frac1) * (1 - null_frac2) * min(1/num_distinct1, 1/num_distinct2)
            = (1 - 0) * (1 - 0) / max(10000, 10000)
            = 0.0001

����ϡ��ƥ�졼�����ˤ����ơ�1����NULL��ʬ�򺹤������������Ϳ��κ����ͤdz�ä��ͤǤ��� ���η�礬��������Ϥ��ιԿ��ϡ�2�Ĥ����ϤΥǥ�����Ѥ�ǻ�٤ˡ����������٤�ݤ�����ΤȤ��Ʒ׻�����ޤ���

rows = (outer_cardinality * inner_cardinality) * selectivity
     = (50 * 10000) * 0.0001
     = 50

2�Ĥ�����Ф���MCV�ꥹ�Ȥ�����ޤ��Τǡ�eqjoinsel��MCV��ɽ��������콸����ʬ�η�������٤���뤿��ˡ�MCV�ꥹ�Ȥ�ľ����Ӥ��ޤ��� �Ĥ���콸�Ĥ��Ф������Ϥ����Ǽ�����Ʊ����ˡ�˽����ޤ���

inner_cardinality��10000���Ĥޤ�tenk2���ѹ����ʤ��������ȼ����Ƥ��뤳�Ȥ����դ��Ƥ��������� EXPLAIN�ν��Ϥ򸡺�����ȡ����Ԥο��꤬50 * 1���Ĥޤꡢ��¦�ιԿ���tenk2�����¦�Υ���ǥå����������������������Կ���ݤ�����������Ƥ���Ȼפ����⤷��ޤ��� ���������ºݤϤ����ǤϤ���ޤ��� ����졼����󥵥����ϡ�����Ū�ʷ��ײ褬��Ƥ��������˿��ꤵ��ޤ��� �⤷���٤Ƥ����ޤ������С���祵��������ꤹ��2�Ĥ���ˡ��Ʊ��������Ƴ���ޤ��� ���������ͼθ��������ʤɤ��װ��ˤ��¿���ۤʤ��礬����ޤ���

�ܺ٤˶�̣����ä��������ˡ��ơ��֥�ʤ��٤Ƥ�WHERE������ˤ����ΡˤΥ����������src/backend/optimizer/util/plancat.c�ǹԤ��ޤ��� ��������٤˴ؤ������Ū�ʥ����å��ˤĤ��Ƥ�src/backend/optimizer/path/clausesel.c�ˤ���ޤ��� �黻�Ҹ�ͭ�������ٴؿ��ˤĤ��ƤϤ����Ƥ�src/backend/utils/adt/selfuncs.c��ˤ���ޤ���