31.14. ��չ�����ӿ�

��ĿǰΪֹ���������Ĺ��̿������㶨��һ�������ͣ��º������²������� ���ǣ����ǻ�������һ�����������͵��ֶ����涨��һ��������Ϊ������ Щ���飬���DZ���Ϊ���������Ͷ���һ�� ���������� ���ǽ���һ����ʵ�����ӵĻ������������������� һ������ B-tree ���ʷ������µIJ������������渴������֮�Ծ���ֵ ������˳������

ע��: �� PostgreSQL �汾7.3֮ǰ�����DZ��� �ֹ���ϵͳ�� pg_amop��pg_amproc���� pg_opclass ��Ӽ�¼���Ա��ڴ����û������������ ������������Ѿ������ˣ���Ϊ�������� CREATE OPERATOR CLASS�� ���ڴ�����Ҫ�ı��¼��ʱ����򵥲��Ҹ������׳���

31.14.1. ���������Ͳ�������

pg_am ��Ϊÿ�������������ڲ��������ʷ�����������һ����¼�� �Ա����ͨ���ʷ�����֧���ڽ��� PostgreSQL�������з��ʷ����� pg_am �ﶼ�������� ���ǿ���ͨ������Ҫ��Ľӿڹ��̲��� pg_am �ﴴ��һ���еİ취����һ���������ʷ��� — ����ЩԶԶ�����˱��� �����ݡ�

һ�����������Ĺ��̲���ֱ��֪���κθ�����������Ҫ������ �������͵���Ϣ���������������������������ڲ����ض� �������͵�ʱ����Ҫʹ�õIJ������ϡ����������������������Ϊ���� ������һ��������һ����������ʹ�õ� WHERE �Ӿ�IJ���������Ҳ����˵ ����ת����һ������ɨ����������һ����������Ҳ��������һЩ���� ������Ҫ���ڲ�������֧�ֹ������������Dz���ֱ�ӺͿ��� ������һ��ʹ�õ� WHERE �Ӿ��������ء�

���ǿ���Ϊͬһ���������ͺ����������������������� ��ô���Ľ���ǣ����ǿ���Ϊһ���������Ͷ�������������塣���磬 һ�� B-tree ����Ҫ��Ϊ��������ÿ���������Ͷ���һ������˳�� ����һ�������������Ͷ��ԣ���һ��ͨ����������ֵ����������� B-tree ����������ܻ����ã�����һ������ʵ�����򣬵ȵȡ� ͨ������һ����������ᱻ��Ϊ��õģ����ұ����Ϊ���������ͺ����� ������ȱʡ��������

ͬ���IJ����������ֿ������ڶ��ֲ�ͬ���������������磬B-tree ��ɢ�з��� �������н� oid_ops �IJ�������������ÿ�������� ����һ��������ʵ�壬����ֱ��塣

31.14.2. ������������

��һ�ֲ�������������IJ�������ͨ��"���Ժ�"��ʶ�ģ� ���Ժ����ڱ�ʶÿ�ֲ����������IJ���������������塣 ���磬B-tree �Լ������ϸ������Ҫ��С�ڵ����ڣ���ˣ���"С��" ��"���ڻ����"�����IJ��������� B-tree ������Ȥ�ġ� ��Ϊ PostgreSQL �����û������������ PostgreSQL �޷��鿴������������ �����磬< �� >=�������������еıȽ���ʲô�� ʵ���ϣ�������������������һ��"����"�������Կ���ʱһ���ԵIJ������� ÿ�ֲ���������ʾ�����ض��������ͣ�������ʵ�ʲ�������Ӧÿ�ֲ��ԣ� �Լ��������������塣

B-tree �������������ֲ��ԣ��� Table 31-2 ����ʾ��

Table 31-2. B-tree ����

��������
��1
С�ڻ����2
����3
���ڻ����4
����5

ɢ������ֻ��ʾ��λ����ȣ��������ֻ������һ�����ԣ� �� Table 31-3 ����ʾ��

Table 31-3. ɢ������

�������Ժ�
����1

R-tree ������﷽�ΰ�����ϵ�����Ƕ����˰˸����ԣ� �� Table 31-4 ����ʾ��

Table 31-4. R-tree ����

�������Ժ�
��...���1
��...��߻����ص�2
�ص�3
��...�ұ߻����ص�4
��...�ұ�5
��ͬ6
����7
������8

GiST �����������������Ǹ�����û�й̶��ز��Լ���ʵ���ϣ��� ÿ���ض� GiST ���������"һ����"֧�ֹ��̽��Ͳ��Ժ���ʲô���ӡ�

��ע�⣬���в��Բ����������ز���ֵ��ʵ���ϣ����ж���Ϊ�������� ���ԵIJ����������뷵������boolean����Ϊ���DZ�������� һ�� WHERE �Ӿ�Ķ��㣬�������ܱ�һ������ʹ�á�

˳����һ�£�pg_am ��� amorderstrategy �ֶθ������Ǹ����������Ƿ�֧�������ɨ�衣����ζ������֧�֣� �����֧�֣�amorderstrategy �Ƕ�Ӧ����������� �IJ��Ժš����磬B-tree �� amorderstrategy = 1�� ������"С��"�IJ��Ժš�

31.14.3. ��������֧�ֹ���

��ʱ�򣬲��Ե���Ϣ����������ϵͳ�������ʹ��ij�������� ʵ���ϣ�������������Ҫ���ӵ�һЩ��������֤�ܹ������� ���磬B-tree �������������ܹ��Ƚ����������Ծ�������һ���Ǵ��ڣ����ڣ� ����С������һ���� ���ƵĻ��� R-tree �������������ܹ����㳤���ε��ཻ�� �����ʹ�С�ȣ���Щ������ SQL ����������ʹ�õIJ�����������Ӧ�� �����DZ����������Ĺ������ʵĹ����ڲ����õĹ��̣�

�������һ������������������һ�����������ͺ�������͵������£� �ĸ��ض�������Ӧ��Щ��ɫ�е���һ��������������������Ҫ�ĺ������� ����������ͨ�������Ǹ���"֧�ֺ������"����ʶҪʹ�õ���ȷ�ĺ�����

B-tree ��Ҫһ��֧�ֺ������� Table 31-5 ����ʾ��

Table 31-5. B-tree ֧�ֺ���

����֧�ֺ�
�Ƚ��������ֲ��ҷ���һ��С���㣬�㣬���ߴ������������ ��ʶ��һ��������С�ڣ����ڻ��Ǵ��ڵڶ������֡� 1

���Ƶ���ɢ������Ҳ��Ҫһ��֧�ֺ������� Table 31-6 ����ʾ��

Table 31-6. ɢ��֧�ֺ���

����֧�ֺ�
Ϊһ�����ֱȽ�ɢ��ֵ1

R-tree ������Ҫ����֧�ֺ������� Table 31-7 ����ʾ��

Table 31-7. R-tree ֧�ֺ���

����֧�ֺ�
����1
��2
��С3

Gist ������Ҫ����֧�ֺ������� Table 31-8 ����ʾ��

Table 31-8. GiST ֧�ֺ���

����֧�ֺ�
һ����1
����2
ѹ��3
��ѹ��4
����5
ѡ�����6
����7

�Ͳ��Բ�������ͬ��֧�ֺ��������ض���������Ԥ�ڵ��������ͣ������� B-tree ������£�����һ������������

31.14.4. ����

��Ȼ�����Ѿ��˽�����Щ�����ô���ھ������dz�ŵ���Ĵ���һ�� �µIJ�����������ӡ� ���������װ����Щ�Ծ���ֵ˳��Ը�������IJ��������������� �Ϳ���ѡ�� complex_abs_ops ������֡� ���ȣ�������Ҫһ�����������ϡ� ���ڶ���������Ĺ����Ѿ���Section 31.12���۹��ˣ� ��������� B-tree �� complex_abs_ops �������� ������Ҫ�IJ������ǣ�

������Ȳ����� C ���뿴������������

#define Mag(c) ((c)->x*(c)->x + (c)->y*(c)->y)

bool
complex_abs_eq(Complex *a, Complex *b)
{
    double amag = Mag(a), bmag = Mag(b);
    return (amag==bmag);
}

�����ĸ��������dz����ƣ��������Դ����� src/tutorial/complex.c �� src/tutorial/complex.sql ��ȡ���롣

Ȼ�������Щ�������������Ͳ�������

CREATE FUNCTION complex_abs_eq(complex, complex) RETURNS boolean
    AS 'filename', 'complex_abs_eq'
    LANGUAGE C;

CREATE OPERATOR = (
    leftarg = complex,
    rightarg = complex,
    procedure = complex_abs_eq,
    restrict = eqsel,
    join = eqjoinsel
);

�������ƺ�����ѡ���Ժ����Ƿdz���Ҫ�ģ������Ż������޷���Ч�� ������������ע�⣬С�ڣ����ںʹ��ڵ������Ӧ��ʹ�ò�ͬ��ѡ���� ������

��������ֵ��һ�����������Ҫ��������֡�

��һ����ע�� B-tree ��Ҫ�ıȽ�"֧�ֹ���"�� ʵ����������� C �����ڰ������������̵�ͬһ���ļ��У� �����Ƕ��庯���ķ�����

CREATE FUNCTION complex_abs_cmp(complex, complex)
    RETURNS integer
    AS 'filename'
    LANGUAGE C;

��Ȼ�����Ѿ�������Ҫ�IJ�������֧�ֹ��̣� ���ǾͿ�����󴴽�������������ˣ�

CREATE OPERATOR CLASS complex_abs_ops
    DEFAULT FOR TYPE complex USING btree AS
        OPERATOR        1       < ,
        OPERATOR        2       <= ,
        OPERATOR        3       = ,
        OPERATOR        4       >= ,
        OPERATOR        5       > ,
        FUNCTION        1       complex_abs_cmp(complex, complex);

�������Ǿ�����ˣ��������ǿ�����һ�� complex ���ϴ�����ʹ�� B-tree �����ˣ�

���ǿ��԰Ѳ�������¼д�ø�����һЩ����

        OPERATOR        1       < (complex, complex) ,

��������ò��������ܵ��������������Ƕ���IJ���������Ķ����� �Ǿ�û��Ҫ��ô����

��������Ӽ������������²���������Ϊ complex �������� ��ȱʡ�� B-tree ������������㲻����ô����ֻҪȥ���ؼ��� DEFAULT �����ˡ�

31.14.5. �����������������

�������ֲ��������������������û�����ۣ���Ҫ����Ϊ���� ����ȱʡ�� B-tree �����������������dz����á�

ͨ������һ������������Ϊһ����������ij�Ա��ζ�������������� ����ʹ�øò�������������һ�� WHERE �������м��ϡ����磬

SELECT * FROM table WHERE integer_column < 4;

������һ�������������ֶ��ϵ� B-tree ������ȷ�����㡣������ʱ�� ������������������������ƥ�������еIJ�����ȷ��ָ�򡣱��磬 ���һ�� R-tree ����ֻΪ����洢�ܽ�ķ��飬��ô�����޷���ȷ�� ����һ�������Ƿ��ζ��󣨱������Σ�֮���Ƿ񸲸ǵ�WHERE�����IJ��ԡ� �������ǿ���ʹ����������ҳ���Щ�ܽ緽���Ŀ�������ܽ緽�� �غϵĶ���Ȼ��ֻ�������ҵ��Ķ���������ȷ���غϲ��ԡ�������� ���ο���ͨ���������Ǿ�˵�����Բ�������"��ɢ��"�� ���������� CREATE OPERATOR CLASS ������� OPERATOR �Ӿ����� RECHECK�����������֤ ��������Ҫ���Ԫ�����һЩ���ӵ��У���ô RECHECK �ͺϷ��� ��Щ�����Ԫ��Ϳ���ͨ��ִ������IJ���������������

�ٿ���������������ֻ�洢���Ӷ��󣨱������Σ����ܽ緽������Ρ� ���������������������Ŀ��洢���������û��̫�����ֵ — ���� Ҳ����ֻ�洢���򵥵����� box �Ķ��� ���������� CREATE OPERATOR CLASS ��� STORAGE ѡ��洢�����ǿ���д���������Ķ���

CREATE OPERATOR CLASS polygon_ops
    DEFAULT FOR TYPE polygon USING gist AS
        ...
        STORAGE box;

Ŀǰ��ֻ�� GiST ��������֧�����ֶ��������Ͳ�ͬ�� STORAGE ���͡� GiST compress �� decompress ֧�ֹ��� ��ʹ�� STORAGE ��ʱ����봦����������ת����