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

Chapter 11. ��ǽ�˴ؤ���ҥ��

Table of Contents
11.1. EXPLAIN������
11.2. �ץ��ʤǻ��Ѥ�������׾���
11.3. ����Ū�� JOIN �ǥץ��ʤ����椹��
11.4. �ǡ����١����ؤΥǡ�������
11.4.1. ��ư���ߥåȤ򥪥դˤ���
11.4.2. COPY FROM��Ȥ�
11.4.3. ����ǥå�����������
11.4.4. ANALYZE ���

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

11.1. EXPLAIN������

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

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

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

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

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

�����Ĥ���򼨤��ޤ���vacuum analyze �򤫤������ regress test �ǡ����١�����ȤäƤ��ޤ������Ѥ��������ƥ�� 7.2 ��ȯ�ǤǤ��ˡ�

regression=# EXPLAIN SELECT * FROM tenk1;
NOTICE:  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���ƤߤƲ������ˡ�

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

regression=# EXPLAIN SELECT * FROM tenk1 WHERE unique1 < 1000;
NOTICE:  QUERY PLAN:

Seq Scan on tenk1  (cost=0.00..358.00 rows=1007 width=148)

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

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

�ǤϤ�����䤤��碌���ѹ��������Τ�궯�����¤��Ƥߤޤ���

regression=# EXPLAIN SELECT * FROM tenk1 WHERE unique1 < 50;
NOTICE:  QUERY PLAN:

Index Scan using tenk1_unique1 on tenk1  (cost=0.00..181.09 rows=49 width=148)

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

�̤θ��������ɲä��ޤ���

regression=# EXPLAIN SELECT * FROM tenk1 WHERE unique1 < 50 AND
regression-# stringu1 = 'xxx';
NOTICE:  QUERY PLAN:

Index Scan using tenk1_unique1 on tenk1  (cost=0.00..181.22 rows=1 width=148)

�ɲä����� stringu1 = 'xxx' �ˤ����ϹԿ��ο����ͤϸ��������ΤΡ��������륿�ץ�ν�����Ѥ��ʤ�����˥����Ȥϸ��äƤ��ޤ���

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

regression=# EXPLAIN SELECT * FROM tenk1 t1, tenk2 t2 WHERE t1.unique1 < 50
regression-# AND t1.unique2 = t2.unique2;
NOTICE:  QUERY PLAN:

Nested Loop  (cost=0.00..330.41 rows=49 width=296)
  ->  Index Scan using tenk1_unique1 on tenk1 t1
               (cost=0.00..181.09 rows=49 width=148)
  ->  Index Scan using tenk2_unique2 on tenk2 t2
               (cost=0.00..3.01 rows=1 width=148)

��������Ҿ��롼�׷��Ǥϡ������������ˡ��Ǹ����Ǽ������Τ�Ʊ������ǥå���������󤬻Ȥ��Ƥ��ޤ��������ơ�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 �ե饰����Ѥ��ơ��ץ��ʤ��Ǥ��ɤ��ȹͤ��Ƥ�����ά����Ū��̵�뤵������ˡ�ˤ�ꡢ�ۤʤä��ײ��ѻ����뤳�Ȥ��Ǥ��ޤ��������˸���Ū�ʥġ���Ǥ��������Ѳ��ͤ�����ޤ��� Section 11.3�⻲�Ȥ�����������

regression=# set enable_nestloop = off;
SET VARIABLE
regression=# EXPLAIN SELECT * FROM tenk1 t1, tenk2 t2 WHERE t1.unique1 < 50
regression-# AND t1.unique2 = t2.unique2;
NOTICE:  QUERY PLAN:

Hash Join  (cost=181.22..564.83 rows=49 width=296)
  ->  Seq Scan on tenk2 t2
               (cost=0.00..333.00 rows=10000 width=148)
  ->  Hash  (cost=181.09..181.09 rows=49 width=148)
        ->  Index Scan using tenk1_unique1 on tenk1 t1
               (cost=0.00..181.09 rows=49 width=148)

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

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

regression=# EXPLAIN ANALYZE
regression-# SELECT * FROM tenk1 t1, tenk2 t2
regression-# WHERE t1.unique1 < 50 AND t1.unique2 = t2.unique2;
NOTICE:  QUERY PLAN:

Nested Loop  (cost=0.00..330.41 rows=49 width=296) (actual time=1.31..28.90 rows=50 loops=1)
  ->  Index Scan using tenk1_unique1 on tenk1 t1
               (cost=0.00..181.09 rows=49 width=148) (actual time=0.69..8.84 rows=50 loops=1)
  ->  Index Scan using tenk2_unique2 on tenk2 t2
               (cost=0.00..3.01 rows=1 width=148) (actual time=0.28..0.31 rows=1 loops=50)
Total runtime: 30.67 msec

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

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

EXPLAIN ANALYZE ��ɽ������� "total runtime"�����¹Ի��֡ˤˤϡ���̥��ץ�����뤿��λ��֤�¾�ˡ����������塼���ε�ư����߻��֤�ޤޤ�ޤ������Ϥ�񤭴������ײ�����λ��֤ϴޤޤ�ޤ���SELECT �䤤��碌�Ǥϡ����¹Ի��֤ϺǾ�̷ײ�Ρ��ɤ���𤵤�������֤����̾ᆵ���礭���ʤ�ޤ���INSERT��UPDATE��DELETE �䤤��碌�Ǥϡ��������¹Ի��֤Ϥ��ʤ��礭���ʤ�ޤ��������ˤϽ��ϥ��ץ�����������֤��ޤޤ�뤫��Ǥ����������䤤��碌�Ǥϡ��Ǿ�̷ײ�Ρ��ɤλ��֤ϡ�����Ū�˿��������ץ��黻�����Ť����ץ�ξ�����ꤹ�뤿��λ��֤򼨤��������ˤ��ѹ���Ԥ����֤ϴޤޤ�ޤ���

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