¾�ΥС�������ʸ�� �� 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 18. ����ǥå��������ȳ����ؿ�

����: 2000 ǯ 1 �� 24 ���� Tom Lane���� �ˤ�äƽ񤫤�ޤ�����

Note: ����Ϻǽ�Ū�ˤϡ�����������ǥå������������᥽�åɤν����ˤĤ��ƤΤ�ä��礭���Ϥΰ����ˤʤ�ʤ���Ф����ޤ���

���٤ƤΥ���ǥå������������᥽�åɤϡ��ץ���/���ץƥ��ޥ���������ѤǤ���褦�˥����ȳ����ؿ����󶡤��ʤ���Ф����ޤ��󡣤��δؿ��Υץ��������� OID �ϥ��������᥽�åɤ� pg_am �Υե������ amcostestimate ��Ϳ�����ޤ���

Note: PostgreSQL 7.0 �����Ǥϡ�����ǥå�������ꤷ�������ȳ����ؿ�����Ͽ�ˤϡ���ä���ˡ���Ȥ��Ƥ��ޤ�����

amcostestimate �ؿ��ϡ�����ǥå����ȶ��˻Ȥ��뤳�Ȥ����ꤵ�줿 WHERE ��Υꥹ�Ȥ�Ϳ�����ޤ������δؿ��ϥ���ǥå����˥����������륳���Ȥγ����� WHERE ��������١ʤĤޤꥤ��ǥå����������ˤ���Ф���륿�ץ�Υᥤ��ơ��֥�ˤ�������ˤ��֤��ʤ��ƤϤ����ޤ���ñ��ʾ����ȡ��ۤȤ�ɤ��٤ƤΥ����ȳ����κ�Ȥϡ����ץƥ��ޥ�����ɸ��롼�����ƤӽФ����ȤǹԤ��ޤ���amcostestimate �ؿ�����Ĥ��Ȥΰ�̣�ϡ�ɸ�೵����������뤳�Ȥ���ǽ�ʾ��ˡ�����ǥå������������᥽�åɤ�����ǥå��������ä��μ��򶡵뤹�뤳�Ȥ��Ǥ���Ȥ������ȤǤ���

���줾��� amcostestimate �ؿ��ϰʲ��Υ����˥��������ʤ���Ф����ޤ���

void
amcostestimate (Query *root,
                RelOptInfo *rel,
                IndexOptInfo *index,
                List *indexQuals,
                Cost *indexStartupCost,
                Cost *indexTotalCost,
                Selectivity *indexSelectivity,
                double *indexCorrelation);

�ǽ��4�ĤΥѥ�᡼�������ϤǤ���

root

��������Ƥ����䤤��碌��

rel

���ꤵ�줿����ǥå����������졼�����

index

����ǥå������Τ�Ρ�

indexQuals

����ǥå��������Υꥹ�ȡʰ���Ū�������Ѥ���ޤ��ˡ�NIL �ꥹ�ȤϻȤ������󤬤ʤ����Ȥ�ɽ���ޤ���

�Ǹ�� 4 �ĤΥѥ�᡼���ϻ����Ϥ��ν��ϤǤ���

*indexStartupCost

����ǥå����ץ������ε�ư�ˤ����륳���Ȥ����ꤵ��ޤ���

*indexTotalCost

����ǥå����ץ����������ΤΥ����Ȥ����ꤵ��ޤ���

*indexSelectivity

����ǥå����������٤����ꤵ��ޤ���

*indexCorrelation

����ǥå����������ν��֤��ظ�Υơ��֥�ν��ִ֤���ط��������ꤵ��ޤ���

�����ȳ����ؿ��ϡ�SQL �䤽��¾�μ�³����ǤϤʤ���C ����ǽ񤫤�ʤ���Ф����ʤ����Ȥ����դ��Ƥ�������������ϥץ���/���ץƥ��ޥ����������ǡ�����¤�˥����������ʤ���Ф����ʤ�����Ǥ���

����ǥå����������������Ȥ� src/backend/optimizer/path/costsize.c �ǻȤ��롢���֤��¤���ǥ������֥��å��μ��Ф��ˤ� 1.0 �Υ����Ȥ�������Ʊ�μ��Ф��ˤ� random_page_cost �Υ����Ȥ��������ơ�1�ĤΥ���ǥå������ץ�ν����ˤ��̾� (����ϥ桼����Ĵ���ǽ�ʥ��ץƥ��ޥ����Υѥ�᡼���Ǥ���) cpu_index_tuple_cost �Ȥ��������Ȥ�������Ȥ��ä���ñ�̤Ƿ׻������٤��Ǥ������ˡ�����ǥå��������ʡ��ä� indexQuals ���Ȥ�ɾ���ˤδ֤˸ƤӽФ������ӱ黻���Ƥ��Ф��ơ�cpu_operator_cost ��Ŭ���ʷ����򤫤��������Ȥ�������ޤ���

�������������Ȥϡ�����ǥå������ȤΥ������ȴط����뤹�٤ƤΥǥ������� CPU �����Ȥ�ޤ�٤��Ǥ���������ǥå����Ǽ��̤����ᥤ��ơ��֥�Υ��ץ�ν�������Фˤ����륳���Ȥϴޤ�ƤϤ����ޤ���

"���ϥ�����"�ϡ��ǽ�Υ��ץ�μ��Ф���Ϥ��������䤵��롢������󥳥������Τΰ����Ǥ����ۤȤ�ɤΥ���ǥå����ǤϤ���� 0 �Ȥ���ޤ������⤤���ϥ����Ȥ���ĥ���ǥå������Ǥ� 0 �ʳ������ꤷ�������褤���⤷��ޤ���

indexSelectivity �ϡ�����ǥå����������δ֤���Ф����ᥤ��ơ��֥�Υ��ץ�γ������줿���Ȥ������ꤵ���٤��Ǥ���̵�̤�¿������ǥå����ξ��Ϥ����ͤ���Ϳ����줿�������ºݤ��̲᤹�륿�ץ�γ�����⤯�ʤ뤳�Ȥ��褯����ޤ���

indexCorrelation �ϡ�����ǥå����ν��֤ȥơ��֥�ν��֤δ֤�(-1.0����1.0 �ޤǤδ֤��ͤ�Ȥ�)��ؤȤ������ꤵ���٤��Ǥ��������ͤϡ��ᥤ��ơ��֥뤫�饿�ץ����Ф�����Υ����ȳ�����Ĵ�����뤿��˻��Ѥ���ޤ���

�����ȳ���

ŵ��Ū�ʥ����ȳ����ϼ��Τ褦�˿ʤ���ޤ���

  1. Ϳ����줿������˴�Ť���ˬ�����ᥤ��ơ��֥�Υ��ץ�γ��򳵻������֤��ޤ�������ǥå��������ä��μ����ʤ���硢ɸ��Υ��ץƥ��ޥ����δؿ��Ǥ��� clauselist_selectivity() ��ȤäƤ���������

    *indexSelectivity = clauselist_selectivity(root, indexQuals,
                                               lfirsti(rel->relids));

  2. ����������ˬ����륤��ǥå������ץ�ο��򳵻����ޤ���¿���Υ���ǥå������Ǥϡ������ indexSelectivity �ȥ���ǥå�������ˤ��륿�ץ����ݤ�����Τ��������Ǥ�����������¿�����⤢��ޤ��ʥ���ǥå����Υڡ������ȥ��ץ�� IndexOptInfo ��¤�Τ������뤳�Ȥ��Ǥ��ޤ��ˡ�

  3. ������������Ф���륤��ǥå����ڡ������򳵻����ޤ�������� indexSelectivity �˥���ǥå����Υڡ�������ݤ�����Τˤʤ�Ǥ��礦��

  4. ����ǥå����������������Ȥ�׻����ޤ�������Ū�ʳ����Ǥϰʲ��Τ褦�ʤ��Ȥ򤹤�Ǥ��礦��

        /*
         * �����Ǥ�����Ū������ϡ�����ǥå����ڡ��������֤��ɤޤ졢���줾���
         * random_page_cost �ǤϤʤ� 1.0 �Υ����Ȥ�������Ȥ������ȤǤ���
         * ����ˡ����줾��Υ���ǥå������ץ�� indexquals ��ɾ����û�����
         * �ޤ������٤ƤΥ����Ȥϥ������δ����ä��ʤ��餫���äƤ�����
         * ���ꤵ��ޤ���
         */
        *indexStartupCost = 0;
        *indexTotalCost = numIndexPages +
            (cpu_index_tuple_cost + cost_qual_eval(indexQuals)) * numIndexTuples;

  5. ����ǥå�������ؤ򳵻����ޤ���1�ĤΥե�����ɤ��Ф���ñ��ʽ��֤Υ���ǥå����Ǥϡ������ pg_statistic �������ꤹ�뤳�Ȥ��Ǥ��ޤ�����ؤ�̤�Τξ�硢������ʳ����� 0 (̵���)�Ȥʤ�ޤ���

�����ȳ����ؿ�����ϡ�src/backend/utils/adt/selfuncs.c �Ǹ��Ĥ��뤳�Ȥ��Ǥ��ޤ���

�̾�ϡ�amcostestimate �ؿ��� pg_proc ���ܤϲ����Τ褦��ɽ������ޤ���

prorettype = 0
pronargs = 8
proargtypes = 0 0 0 0 0 0 0 0

pg_type���Τ��뷿����äƤ���������ʤ����ᡢ�����Ǥ�0�ʥ����ˤ�ȤäƤ��ޤ���