| PostgreSQL 9.1.5ʸ�� | ||||
|---|---|---|---|---|
| 前のページ | 巻戻し | 第 57章�ץ��ʤ��������ɤΤ褦�˻��Ѥ��뤫 | 早送り | 次のページ |
�ʲ������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.01833333MCF�����¤Ϥޤ���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��ˤ���ޤ���