PostgreSQL 8.0.0 �����ĵ���PostgreSQL �й� ������ | ||||
---|---|---|---|---|
Prev | Fast Backward | Chapter 31. ��չ SQL | Fast Forward | Next |
��ĿǰΪֹ���������Ĺ��̿������㶨��һ�������ͣ��º������²������� ���ǣ����ǻ�������һ�����������͵��ֶ����涨��һ��������Ϊ������ Щ���飬���DZ���Ϊ���������Ͷ���һ�� ���������� ���ǽ���һ����ʵ�����ӵĻ������������������� һ������ B-tree ���ʷ������µIJ������������渴������֮�Ծ���ֵ ������˳������
ע��: �� PostgreSQL �汾7.3֮ǰ�����DZ��� �ֹ���ϵͳ�� pg_amop��pg_amproc���� pg_opclass ��Ӽ�¼���Ա��ڴ����û������������ ������������Ѿ������ˣ���Ϊ�������� CREATE OPERATOR CLASS�� ���ڴ�����Ҫ�ı��¼��ʱ������Ҹ������׳���
pg_am ��Ϊÿ�������������ڲ��������ʷ�����������һ����¼�� �Ա����ͨ���ʷ�����֧���ڽ��� PostgreSQL�������з��ʷ����� pg_am �ﶼ�������� ���ǿ���ͨ������Ҫ��Ľӿڹ��̲��� pg_am �ﴴ��һ���еİ취����һ���������ʷ��� — ����ЩԶԶ�����˱��� �����ݡ�
һ�����������Ĺ��̲���ֱ��֪���κθ�����������Ҫ������ �������͵���Ϣ���������������������������ڲ����ض� �������͵�ʱ����Ҫʹ�õIJ������ϡ����������������������Ϊ���� ������һ��������һ����������ʹ�õ� WHERE �Ӿ�IJ���������Ҳ����˵ ����ת����һ������ɨ����������һ����������Ҳ��������һЩ���� ������Ҫ���ڲ�������֧�ֹ������������Dz���ֱ�ӺͿ��� ������һ��ʹ�õ� WHERE �Ӿ��������ء�
���ǿ���Ϊͬһ���������ͺ����������������������� ��ô���Ľ���ǣ����ǿ���Ϊһ���������Ͷ�������������塣���磬 һ�� B-tree ����Ҫ��Ϊ��������ÿ���������Ͷ���һ������˳�� ����һ�������������Ͷ��ԣ���һ��ͨ����������ֵ����������� B-tree ����������ܻ����ã�����һ������ʵ�����ȵȡ� ͨ������һ����������ᱻ��Ϊ��õģ����ұ����Ϊ���������ͺ����� ������ȱʡ��������
ͬ���IJ����������ֿ������ڶ��ֲ�ͬ���������������磬B-tree ��ɢ�з��� �������н� oid_ops �IJ�������������ÿ�������� ����һ��������ʵ�壬����ֱ��塣
��һ�ֲ�������������IJ�������ͨ��"���Ժ�"��ʶ�ģ� ���Ժ����ڱ�ʶÿ�ֲ����������IJ���������������塣 ���磬B-tree �Լ������ϸ������Ҫ��С�ڵ����ڣ���ˣ���"С��" ��"���ڻ����"�����IJ��������� B-tree ������Ȥ�ġ� ��Ϊ PostgreSQL �����û������������ PostgreSQL ���鿴������������ �����磬< �� >=�������������еıȽ���ʲô�� ʵ���ϣ�������������������һ��"����"�������Կ���ʱһ���ԵIJ������� ÿ�ֲ���������ʾ�����ض��������ͣ�������ʵ�ʲ�������Ӧÿ�ֲ��ԣ� �Լ��������������塣
B-tree �������������ֲ��ԣ��� Table 31-2 ����ʾ��
ɢ������ֻ��ʾ��λ����ȣ��������ֻ������һ�����ԣ� �� Table 31-3 ����ʾ��
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��Ժš�
��ʱ���Ե���Ϣ����������ϵͳ�������ʹ��ij�������� ʵ���ϣ�������������Ҫ���ӵ�һЩ��������֤�ܹ������� ���磬B-tree �������������ܹ��Ƚ����������Ծ�������һ���Ǵ��ڣ����ڣ� ����С������һ���� ���ƵĻ��� R-tree �������������ܹ����㳤���ε��ཻ�� �����ʹ�С�ȣ���Щ������ SQL ����������ʹ�õIJ�����������Ӧ�� �����DZ����������Ĺ������ʵĹ����ڲ����õĹ��̣�
�������һ������������������һ�����������ͺ�������͵������£� �ĸ��ض�������Ӧ��Щ��ɫ�е���һ��������������������Ҫ�ĺ������� ����������ͨ�������Ǹ���"֧�ֺ������"����ʶҪʹ�õ���ȷ�ĺ�����
B-tree ��Ҫһ��֧�ֺ������� Table 31-5 ����ʾ��
Table 31-5. B-tree ֧�ֺ���
���� | ֧�ֺ� |
---|---|
�Ƚ��������ֲ��ҷ���һ��С���㣬�㣬���ߴ������������ ��ʶ��һ��������С�ڣ����ڻ��Ǵ��ڵڶ������֡� | 1 |
���Ƶ���ɢ������Ҳ��Ҫһ��֧�ֺ������� Table 31-6 ����ʾ��
R-tree ������Ҫ����֧�ֺ������� Table 31-7 ����ʾ��
Gist ������Ҫ����֧�ֺ������� Table 31-8 ����ʾ��
�Ͳ��Բ�������ͬ��֧�ֺ��������ض���������Ԥ�ڵ��������ͣ������� B-tree ������£�����һ������������
��Ȼ�����Ѿ��˽�����Щ�����ô���ھ������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���Ҫ�ģ������Ż���������Ч�� ������������ע�⣬С�ڣ����ںʹ��ڵ������Ӧ��ʹ�ò�ͬ��ѡ���� ������
��������ֵ��һ�����������Ҫ��������֡�
���ǿ���ֻ��һ�������˵IJ������������� =�� �������� complex ��Ϊ���������������������������û���������� complex �� =���������������������Ҫ����һ��ʵ�õ��������ͣ� ���ǿ�����Ҫ=��Ϊ���ڸ�������ͨ���ڲ����IJ������� ������������ǿ�����Ҫʹ��һЩ�������������������� complex_abs_eq��
����PostgreSQL���Դ���ͬ���������� ֻҪ���ǵ������������Ͳ�ͬ�� �� C ֻ�ܴ���һ�����и������Ƶ�ȫ�ֹ��̣� ������Dz��ܰ� C ��������Ϊ�� abs_eq ���������֣� ͨ���� C ���������������������������һ����ϰ�ߣ� �����Ͳ�������������������͵ĺ�����ͻ��
���ǿ��������� abs_eq �� PostgreSQL ������ ���� PostgreSQL ͨ�������������͵IJ�ͬ�����κ�����ͬ�� PostgreSQL������ Ϊ�������Ӽ��������ĺ����� C ��κ� PostgreSQL��ζ�����ͬ�����ƣ�
��һ����ע�� 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 �����ˡ�
�������ֲ��������������������û�����ۣ���Ҫ����Ϊ���� ����ȱʡ�� 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 ��ʱ����봦����������ת����