¾�ΥС�������ʸ�� �� 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

�� 13����ǽ�˴ؤ���ҥ��

�ܼ�
13.1. EXPLAIN������
13.2. �ץ��ʤǻ��Ѥ�������׾���
13.3. ����Ū��JOIN��ǥץ��ʤ����椹��
13.4. �ǡ����١����ؤΥǡ�������
13.4.1. ��ư���ߥåȤ򥪥դˤ���
13.4.2. COPY���
13.4.3. ����ǥå�����������
13.4.4. maintenance_work_mem�����䤹
13.4.5. checkpoint_segments�����䤹
13.4.6. �Ǹ��ANALYZE��¹�

�䤤��碌����ǽ��¿�����װ��˱ƶ�����ޤ��� �桼��������Ǥ����Τ⤢��ޤ������ظ�ˤ��륷���ƥ��߷פ˵������뺬��Ū���װ��⤢��ޤ��� �ܾϤǤ�PostgreSQL����ǽ�����򤷡����塼�˥󥰤��뤿��Υҥ�Ȥ��󶡤��ޤ���

13.1. EXPLAIN������

PostgreSQL��Ϳ����줿�䤤��碌�����䤤��碌�ײ�����Ф��ޤ��� �䤤��碌�ι�¤�ȴޤޤ��ǡ�����������Ŭ�����������䤤��碌�ײ�����򤹤뤳�Ȥ��ɤ���ǽ�����뤿������˽��פˤʤ�ޤ��� EXPLAIN���ޥ�ɤ�Ȥ��С�Ǥ�դ��䤤��碌���Ф��ƥ����ƥब�ɤΤ褦���䤤��碌�ײ���ä��Τ��狼��ޤ��� �䤤��碌�ײ���ɤߤ��ʤ����ȤˤĤ��Ƥϡ����ӹ��ϰϤˤ錄����塼�ȥꥢ�����ʤ���Фʤ�ʤ��ۤɤ��Ӥ�ɬ�פǤ��� ����ʸ��Ϥ����ޤǥ��С����ޤ��󤬡�����Ū�ʾ���򤤤��Ĥ��󶡤��ޤ���

���ߤΤȤ���EXPLAIN�����Ϥ�����ͤˤϰʲ��Τ�Τ�����ޤ���

�����Ȥϡ����Ф��ǥ������ڡ���ñ�̤�¬�ꤵ��ޤ��� (CPU����ô�˴ؤ��Ƥο���ϡ�Ŭ�������Ū�˷�᤿���ˤ������äƥǥ������ڡ���ñ�̤Ǵ�������ޤ��� �����δ���ͤθ��̤��Τꤿ�����ϡ���16.4.5.2�μ¹Ի�����ѥ�᡼���ΰ����򻲾Ȥ��Ƥ���������)

��̥Ρ��ɤΥ����Ȥˤϡ����ƤλҥΡ��ɤΥ����Ȥ⤽����˴ޤޤ�Ƥ��뤳�Ȥ˽�ʬα�դ��Ƥ��������� ���Υ����Ȥϥץ��ʤ䥪�ץƥ��ޥ�������Ϳ���륳���ȤΤ�ȿ�Ǥ�������ޤ����פǤ��� �Ȥ�櫓����̤ιԤ�ե���ȥ���ɤ�ž�����륳���Ȥϡ��ºݤν������֤���Ⱦ�������ǽ��������ˤ�ؤ�餺����θ����ޤ��� �ץ��ʤϡ��ײ�򤤤����ѹ����褦�ȡ��ɤ����뤳�Ȥ�Ǥ��ʤ����ᡢ�����̵�뤷�ޤ��� (�������ײ�Ϥɤ�ʤ�ΤǤ��졢����Ʊ���Ԥ��̤Ȥ��ƽ��Ϥ���ȿ����Ƥ��ޤ���)

���ϹԿ����䤤��碌�ˤ�äƽ������뤤�ϥ�����󤵤줿�Կ���ɽ�������ʤ��Τ���¿�������ˤ����ʤäƤ��ޤ��� �����Ρ��ɤ�Ŭ�Ѥ�������Ƥ�WHERE�����󤫤���������������ͤ�ȿ�Ǥ����̾�λ����⾯�ʤ��Կ��ˤʤ�ޤ��� ����Ū�ˤϡ��Ǿ�̤ιԿ��ο����ͤϡ��ºݤ��䤤��碌�ˤ�ä��֤��졢�������졢���뤤�Ϻ�����줿�����ιԿ��Ȥʤ�ޤ���

�����Ĥ���򼨤��ޤ� (VACUUM ANALYZE�򤫤������regression test�ǡ����١�����ȤäƤ��ޤ������Ѥ�����������7.3��ȯ�ǤǤ�)��

EXPLAIN SELECT * FROM tenk1;

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

����ϤۤȤ�ɸ����ޤޤǤ����⤷��

SELECT * FROM pg_class WHERE relname = 'tenk1';

��¹Ԥ���ȡ�tenk1�ˤ�233�Υǥ������ڡ�����10000�ιԤ����뤳�Ȥ��狼��ޤ��� �Ǥ����顢ñ�̤�����1.0�ȥ����Ȥ���ޤäƤ���233�ڡ������ɤ߽Ф��ˡ�����0.01�����ꤵ��Ƥ���cpu_tuple_cost��10000�ܤ�����Τ�ä�����Τ��������Ȥο����ͤˤʤ�櫓�Ǥ�����SHOW cpu_tuple_cost���ƤߤƤ�����������

�Ǥϡ�WHERE����ä����䤤��碌���ѹ����Ƥߤޤ���

EXPLAIN SELECT * FROM tenk1 WHERE unique1 < 1000;

                         QUERY PLAN
------------------------------------------------------------
 Seq Scan on tenk1  (cost=0.00..358.00 rows=1033 width=148)
   Filter: (unique1 < 1000)

WHERE�礬���뤿�ᡢ���ϹԿ��θ��Ѥ꤬�������ʤäƤ��ޤ��� �������������Ȥ���10000�����Ƥ򥹥���󤹤�ɬ�פ����뤿�ᡢ�����ȤϾ������ʤäƤ��ޤ��� �ºݤˤϡ�WHERE���򸡺����뤿���CPU���֤�;�פˤ����뤳�Ȥ�ȿ�Ǥ��ơ��ۤ�ξ����Ǥ��������Ȥ��徺���Ƥ��ޤ���

�����䤤��碌�����򤹤�ºݤιԿ���1000�Ǥ��� ������������ϳ����ͤˤ����ޤ��� ���μ¸������¹Ԥ�����硢�����餯¿���ۤʤ�����ͤ�����Ǥ��礦�� ��äȤ����ȡ������ANALYZE���ޥ�ɤ�Ԥ��٤��Ѳ����ޤ��� �ʤ��ʤ顢ANALYZE��������������׾���ϡ��ơ��֥�Υ������ɸ�ܤ�����Ф���뤫��Ǥ���

�Ǥϡ������䤤��碌���ѹ����������궯�����¤��Ƥߤޤ���

EXPLAIN SELECT * FROM tenk1 WHERE unique1 < 50;

                                   QUERY PLAN
-------------------------------------------------------------------------------
 Index Scan using tenk1_unique1 on tenk1  (cost=0.00..179.33 rows=49 width=148)
   Index Cond: (unique1 < 50)

WHERE�������������ʬ�˹���ȡ��ץ��ʤϥ������󥷥�륹�������⥤��ǥå���������󤬰²��Ǥ���ȷ��ꤹ��褦�ˤʤ뤳�Ȥ�ʬ����ޤ��� ���ηײ�Ǥϡ�����ǥå��������뤿��ˤ��ä�50�Ԥ����˥�����������Ф褤���Ȥˤʤ�ޤ��� �Ǥ����顢�ǥ������ڡ������Τ��༡�ɤߤȤ���⡢����ǥå����ˤ��ġ��μ��Ф��Ϲ���ˤĤ��ˤ�ؤ�餺�����ηײ褬���Ѥ���ޤ���

WHERE���˶��⤦1���ɲä��ޤ���

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

                                  QUERY PLAN
-------------------------------------------------------------------------------
 Index Scan using tenk1_unique1 on tenk1  (cost=0.00..179.45 rows=1 width=148)
   Index Cond: (unique1 < 50)
   Filter: (stringu1 = 'xxx'::name)

�ɲä�����stringu1 = 'xxx'�ˤ����ϹԿ��ο����ͤϸ��������ΤΡ���������Ԥν�����Ѥ��ʤ�����˥����Ȥϸ��äƤ��ޤ��� ����stringu1��ϡ�����ǥå������Ȥ��Ƥ�Ŭ�ѤǤ��ʤ����Ȥ����դ��Ƥ������� (���Υ���ǥå����ϡ�unique1��Τߤ��оݤȤ��Ƥ��뤫��Ǥ�)�� �������ꡢstringu1��ϡ�����ǥå����ˤ�ä���Ф��줿�ԤΥե��륿�Ȥ���Ŭ�Ѥ���Ƥ��ޤ��� ����ˤ�ꡢ�ɲ�ʬ�Υ����å���ȿ�Ǥ��뤿�ᡢ�����ȤϼºݤˤϾ����夬��ޤ���

���ޤ������˻ȤäƤ����ե�����ɤ�Ȥä�2�ĤΥơ��֥���礷�Ƥߤޤ��礦��

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

                               QUERY PLAN
----------------------------------------------------------------------------
 Nested Loop  (cost=0.00..327.02 rows=49 width=296)
   ->  Index Scan using tenk1_unique1 on tenk1 t1
                                      (cost=0.00..179.33 rows=49 width=148)
         Index Cond: (unique1 < 50)
   ->  Index Scan using tenk2_unique2 on tenk2 t2
                                      (cost=0.00..3.01 rows=1 width=148)
         Index Cond: ("outer".unique2 = t2.unique2)

��������Ҿ��롼�׷��Ǥϡ������������ˡ��Ǹ����Ǽ������Τ�Ʊ������ǥå���������󤬻Ȥ��Ƥ��ޤ��� �����ơ�unique1 < 50 WHERE������Ρ��ɤ�Ŭ�Ѥ��Ƥ��뤿�ᡢ�����ȤȽ��ϹԿ����Ѥ�äƤ��ޤ��� �����ʳ��Ǥ�t1.unique2 = t2.unique2��ϴط����Ƥ��餺�������������ˤ�������ϹԿ��˱ƶ����Ƥ��ޤ��� �����������Ǥϡ������������ˤ����븽�ߤιԤ�unique2���ͤ������Υ���ǥå������������ꤲ���ޤ졢t2.unique2 = constant�Τ褦�ʥ���ǥå��������������ޤ��� ���äơ������������ηײ�ȥ����Ȥϡ��㤨��EXPLAIN SELECT * FROM tenk2 WHERE unique2 = 42�Τ褦���䤤��碌��Ʊ���Ǥ��� �롼�ץΡ��ɤΥ����Ȥϡ������������Υ����Ȥȡ��ơ��γ����ιԤ��Ф�������������󤬷����֤���뤳�Ȥˤ�륳���ȡʤ����Ǥ�49 * 3.01�ˤ�ä������˷�������Ԥ�����ξ�����CPU���֤�ä�����Τˤʤ�ޤ���

������Ǥϡ����ν��ϹԿ���2�ĤΥ������ν��ϹԿ����Ѥ��������ʤäƤ��ޤ��������Ĥ⤽���ʤ�櫓�ǤϤ���ޤ��� �����Ƥ��ξ�硢2�ĤΥơ��֥�˴ط�����WHERE�礬���äơ�����WHERE������ϥ��������ǤϤʤ�������Ԥ��ݤ�Ŭ�Ѥ���뤫��Ǥ��� �㤨�С�WHERE ... AND t1.hundred < t2.hundred�Ȥ�������ɲä����Ȥ���ȡ����Ρ��ɤν��ϹԿ��򸺤餷�Ϥ��ޤ��������ϥ������ˤϱƶ����ޤ���

���䤤��碌�ײ�μ�����Ф���enable/disable�ե饰����Ѥ��ơ��ץ��ʤ��Ǥ��ɤ��ȹͤ��Ƥ�����ά����Ū��̵�뤵������ˡ�ˤ�ꡢ�ۤʤä��ײ��ѻ����뤳�Ȥ��Ǥ��ޤ��� �����˸���Ū�ʥġ���Ǥ��������Ѳ��ͤ�����ޤ��� ��13.3�⻲�Ȥ���������)

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

                               QUERY PLAN
--------------------------------------------------------------------------
 Hash Join  (cost=179.45..563.06 rows=49 width=296)
   Hash Cond: ("outer".unique2 = "inner".unique2)
   ->  Seq Scan on tenk2 t2  (cost=0.00..333.00 rows=10000 width=148)
   ->  Hash  (cost=179.33..179.33 rows=49 width=148)
         ->  Index Scan using tenk1_unique1 on tenk1 t1
                                    (cost=0.00..179.33 rows=49 width=148)
               Index Cond: (unique1 < 50)

���ηײ�Ǥϡ�����ǥå�����������Ȥä�tenk1����ɬ�פ�50�Ԥ���Ф��ƥ����Υϥå���ơ��֥�˳�Ǽ�������θ塢tenk2�򥷡����󥷥�륹����󤷤ơ�tenk2�ι����t1.unique2 = t2.unique2�����������ɤ����ϥå���ơ��֥�򸡺����ޤ��� tenk1���ɤ߼�ꡢ�ϥå���ơ��֥�����ꤹ�뤿��Υ����Ȥϡ�tenk2���ɤ߼���Ϥ��ޤǹԤ����ꤷ�ޤ���Τǡ������˥ϥå�����ν�������ȤȤʤ�ޤ��� �ޤ������η��ο��������֤ˤϡ��ϥå���ơ��֥��10000�󸡺����롢�礭��CPU���֤��ޤޤ�Ƥ��ޤ��� �����������ηײ跿�Ǥϥϥå���ơ��֥������ϰ��٤ΤߤΤ��ᡢ10000x179.33ʬ�Υ����Ȥ�������ʤ����Ȥ����դ��Ƥ���������

EXPLAIN ANALYZE����Ѥ��ơ��ץ��ʤ����ꤹ�륳���Ȥ����٤��������뤳�Ȥ��Ǥ��ޤ��� ���Υ��ޥ�ɤϼºݤˤ����䤤��碌��¹Ԥ����ײ�Ρ�������פ����ºݤμ¹Ի��֤����̤�EXPLAIN���������ꥳ���Ȥ�Ʊ���ͤȰ���ɽ�����ޤ��� �㤨�С��ʲ��Τ褦�ʷ�̤����뤳�Ȥ��Ǥ��ޤ���

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

                                   QUERY PLAN
-------------------------------------------------------------------------------
 Nested Loop  (cost=0.00..327.02 rows=49 width=296)
                                 (actual time=1.181..29.822 rows=50 loops=1)
   ->  Index Scan using tenk1_unique1 on tenk1 t1
                  (cost=0.00..179.33 rows=49 width=148)
                                 (actual time=0.630..8.917 rows=50 loops=1)
         Index Cond: (unique1 < 50)
   ->  Index Scan using tenk2_unique2 on tenk2 t2
                  (cost=0.00..3.01 rows=1 width=148)
                                 (actual time=0.295..0.324 rows=1 loops=50)
         Index Cond: ("outer".unique2 = t2.unique2)
 Total runtime: 31.604 ms

"actual time"�ͤϼ»��֤�ߥ���ñ�̤�ɽ����Ƥ��뤳�ȡ�"cost"�����ͤϥǥ������ɤ߼��˴ؤ��벿�餫��ñ�̤�ɽ����Ƥ��뤳�Ȥ����դ��Ƥ��������� �Ǥ����餽�Τޤ���Ӥ��뤳�ȤϤǤ��ޤ��� ���ܤ������Ϥ��γ��Ǥ���

�䤤��碌�ײ����ˤϡ���������ײ�Ρ��ɤ�¹ԤǤ����Τ�����ޤ��� �㤨�С���Ҥ�����Ҿ��롼�פηײ�Ǥϡ���������ǥå����������ϳ����ι���˰��ٹԤ��ޤ��� ���Τ褦�ʾ�硢"loops"�ͤϤ��ΥΡ��ɤ�¹Ԥ������������𤷡�ɽ�������ºݤλ��֤ȹԿ���1�¹��������ʿ�ѤǤ��� �����ɽ�����줿���ꥳ���Ȥ���ӤǤ����ͤ�������뤳�ȤǹԤ��ޤ��� "loops"�ͤ򤫤��뤳�Ȥǡ����ΥΡ��ɤǼºݤ���䤵�줿�����֤����뤳�Ȥ��Ǥ��ޤ���

EXPLAIN ANALYZE��ɽ�������Total runtime(���¹Ի���)�ˤϡ���̹Ԥ����뤿��λ��֤�¾�ˡ����������塼���ε�ư����߻��֤�ޤޤ�ޤ��� ���Ϥ�񤭴������ײ�����λ��֤ϴޤޤ�ޤ��� SELECT�䤤��碌�Ǥϡ����¹Ի��֤ϺǾ�̷ײ�Ρ��ɤ���𤵤�������֤����̾ᆵ���礭���ʤ�ޤ��� INSERT��UPDATE������� DELETE���ޥ�ɤǤϡ��������¹Ի��֤Ϥ��ʤ��礭���ʤ�ޤ��� �����ˤϡ���̹Ԥ����������֤��ޤޤ�뤫��Ǥ��� �����Υ��ޥ�ɤǤϡ��Ǿ�̷ײ�Ρ��ɤλ��֤ϡ�����Ū�˿������Ԥ�黻�����Ť��Ԥξ�����ꤹ�뤿��λ��֤򼨤��������ˤ��ѹ���Ԥ����֤ϴޤޤ�ޤ���

EXPLAIN�η�̤򡢻��Ԥä���ΰʳ��ο���˻ȤäƤϤ����ʤ����Ȥϡ������ޤǤ⤢��ޤ��� �㤨�С������ʥơ��֥�η�̤ϡ�����ʥơ��֥��Ŭ�ѤǤ���Ȥϲ���Ǥ��ޤ��� �ץ��ʤο��ꥳ���Ȥ������ǤϤʤ������Τ��ᡢ�ơ��֥���羮�ˤ�äưۤʤ�ײ�����򤷤ޤ��� ��ü����Ǥ������ơ��֥뤬1�ǥ������ڡ����������ʤ���硢����ǥå��������ѤǤ��롢�Ǥ��ʤ��˴ط��ʤ����ۤȤ�ɾ�˥������󥷥�륹�����ײ�����뤳�Ȥˤʤ�ޤ��� �ץ��ʤϡ��ɤΤ褦�ʾ��Ǥ�ơ��֥��������뤿���1�ǥ������ڡ����ɤ߼���Ԥʤ��Τǡ�����ǥå����򻲾Ȥ��뤿����ɲ�Ū�ڡ����ɤ߼���Ԥ����ͤ��ʤ����Ȥ��ΤäƤ��ޤ���