31.13. �������Ż���Ϣ

PostgreSQL �IJ�����������԰���������ѡ���Ӿ䣬 ��Щ�Ӿ����ϵͳһЩ���ڸò����������Ե�������Ϣ�� �ڿ��ܵ�����£����Ƕ�Ӧ���ṩ��Щ�Ӿ䣬 ��Ϊ���ǿ���Ϊʹ������������IJ�ѯ�����ɹ۵��ٶ������� ����Ҫע���������������Щ�Ӿ䣬�����ȷ����������ȷ�ģ� ���Ż��Ӿ�Ĵ���ʹ�ý����·������ı����� ΢С����������������������顣��������Щ���鲻ȷ���Ļ��� ��������Ǻ����Ż��Ӿ䣻Ψһ�ĺ���Dz�ѯ���ܱ���Ҫ�����е���һЩ��

���ӵ��Ż��Ӿ�����ڽ��� PostgreSQL�汾����֡� ���������Ķ��ǰ汾 8.0.0 �������ġ�

31.13.1. COMMUTATOR

����ṩ�� COMMUTATOR�Ӿ䣬������һ���������DZ�����IJ������Ľ������� ���������������A��B�������κο��ܵ�������ֵ x��y ���� A��B�������κο��ܵ�������ֵ���� (x A y) ���� (y B x)����ô���Ǿ�˵ A �� B �Ľ������� ͬ�� B Ҳ�� A �Ľ������� ���磬������ < �� > ������ʹ�õ�һ������������ͨ�����ǶԷ��Ľ������� �������� '+' ͨ����������Ľ����������Dz����� '-' ͨ��û�н�������

һ��������IJ�������������������Ľ��������Ҳ�����������ͬ����֮��Ȼ�� ���� PostgreSQL����Ҫ��ֻ��һ�����������������������Բ��Ҹý������� ��Ҳ��COMMUTATOR �Ӿ�������Ҫ��Ψһ�Ķ�����

����Щ���������������Ӿ�����ʹ�õIJ������ṩ�������Ƿdz��ؼ��ģ� ��Ϊ�����������ѯ�Ż���"�ƶ�"�������Ӿ䣬�γ�����Ҫ�IJ�ͬ�Ĺ滮���͵���ʽ�� ���磬����һ�������� tab1.x = tab2.y �� WHERE �Ӿ�IJ�ѯ�� ���� tab1.x �� tab2.y ���û��������ͣ����Ҽ��� tab2.y ������������ �����Ż���֪������� tab2.y = tab1.x ��Χ�Ĵ��ƶ����Ӿ䣬 ������������������ɨ�裬��Ϊ����ɨ������������������ֶ��ڸ����IJ���������ߡ� PostgreSQL�����򵥵ؼ�������һ���Ϸ���ת�� — = �Ĵ����߱�������������Ч�ģ������Ǹ������������ǽ�������Ϣ��

���㶨��һ���Ի���IJ�����ʱ���㶨���������ˡ� ���㶨��һ�Խ�����������ʱ���������һ�㼬�֣� ��������һ���������Ľ�����ָ����һ���㻹û�ж���IJ������أ� ���Ƕ�����������������������

31.13.2. NEGATOR

����ṩ��NEGATOR�Ӿ䣬������һ���������DZ�����IJ������ķ񶨷��� ��������������ز��������IJ����� A �� B�����κο��ܵ����� x �� y�� ���� (x A y) ���� NOT (x B y)����ô����˵ A �� B �ķ񶨷��� ��Ȼ B Ҳ�� A �ķ񶨷������磬< �� >= �Դ��������������һ�Է񶨷��� һ�������������������������Ч��������

���󽻻�����һ�Ե�Ŀ���������Ի�Ϊ��Ч�ķ񶨷��� �Ǿ���ζ�Ŷ������е� x��(A x) ���� NOT (B x)���������Ƶ���Ŀ�����������������

һ���������ķ񶨷���������������IJ���������һ�������/���Ҳ������� ���Ծ���COMMUTATORһ����ֻ�в���������Ҫ��NEGATOR�Ӿ����������

�ṩ�񶨷��Բ�ѯ�Ż����Ƿdz��а����ģ� ��Ϊ������������NOT (x = y)�����ı��ʽ�򻯳� x <> y��������������������ҪƵ���Ķ࣬ ��ΪNOT������Ϊ�����������ж������롣

�񶨷��Կ��������滻������н��͵���ͬ�ķ��������塣

31.13.3. RESTRICT

����ṩ��RESTRICT�Ӿ䣬��Ϊ����������һ��ѡ�������Ƽ��㺯�� ��ע��������һ����������������һ�������������� RESTRICT�Ӿ�ֻ�ǶԷ���boolean������˫Ŀ�����������塣 ѡ�������Ƽ�����ĸ����Dz²�һ�����������е��� һ���ֶ���Ŀǰ�IJ��������ض��ij���������һ��������������ʽ�� WHERE �����Ӿ�

column OP constant

�����Ը����������͵�WHERE�Ӿ����ɾ�������е�һ����� �⽫�����Ż��������Ż���������ܻ�˵�� ����ó�����constant���������ô�죿Ŷ������COMMUTATOR �ɵ���...��

��д�µ�ѡ�������Ƽ��㺯��ԶԶ�����˱��µķ�Χ�� ���������˵��ǣ�ͨ������Լ��IJ�����ֻ��Ҫʹ��ϵͳ��׼�ļ�����֮һ�����ˡ�������һЩ��׼���Ƽ�������

eqsel for =
neqsel for <>
scalarltsel for < or <=
scalargtsel for > or >=

��Щ���Ƿ��࣬�������е���֣������������ϸ���룬�ͻ�����е��� '=' ��ཫֻ���ܱ��е�һС�����У� '<>' ��ཫ�ܾ�һС�����С� '<' �����ܵ���ȡ���ڸ����ij������ڱ�ĸ�������ֵ����һ����Χ�� ����ֵ������ ANALYZE �ռ������ṩ��ѡ���Լ���������Ϣ���� '<=' ��ͬ���ij���ʱ����ܱ� '<' ��΢��һЩ���У� ��������Ҳ�dz��ӽ���������ֵ���������� �����������������Ҳ����ä�ºõöࡣ���Ƶ����Ҳ������ '>' and '>='��

����ܳ�ϰ���ڰ�eqsel����neqsel ������Щ�dz��߻��߷dz���ѡ���ԵIJ���������ʹ���Dz���������Ȼ��߲���ȡ����磬 ���β�����Լ���ھ�ʹ��eqsel�����ǻ��������ļ��裺 ����ֻ��ƥ���������е�һС���ּ�¼��

����԰�scalarltsel��scalargtsel ���ڱȽ���ЩΪ���з�Χ�Ƚϱ�ת��Ϊ���ֳ߶Ⱥ�������������������͡� ������ܣ��Ѹ������������ӵ����Ա��ļ� src/backend/utils/adt/selfuncs.c��ĺ��� convert_to_scalar() ���IJ��֡������գ�������̽����ŵ���pg_type �����һ���б�ʶ��ÿ������һ���ĺ������棬����Ŀǰ��û����ô������ �����û������Щ��ϵͳ��Ȼ�ܹ����������Ż����Ĺ��Ʋ������������ô�á�

��src/backend/utils/adt/geo_selfuncs.c �ﻹ��Ϊ���β�������ƵĶ����ѡ��������������areasel�� positionsel�� ��contsel������д��Щ��ʱ�����Ƕ�ֻ�Ǵ���� �����㻹�ǿ���ʹ�ã����߸��õ��ǣ��������ǣ����ǡ�

31.13.4. JOIN

����ṩ��JOIN�Ӿ䣬 ��Ϊ����������һ������ѡ���Ժ�������ע�������Ǻ����������Dz����������� JOIN�Ӿ�ֻ�ǶԷ���boolean��˫Ŀ�����������塣 һ������ѡ���Լ���������ĸ����Dz²�һ�Ա��ϵ���һ���� �ж�Ŀǰ�IJ�����������������ʽ��WHERE�Ӿ������

table1.field1 OP table2.field2

��RESTRICT�Ӿ�һ���� ��Щ���п��ܰ����Ż��������ٵĴ�������Ҫ��ȡ���ܵ�����˳���е���һ����

��ǰ��һ�������ڲ�����ͼ���������дһ������ѡ���Լ����������� ���ǻὨ��������һ�����õ�����£�ʹ��һ����׼�ļ�������

eqjoinsel for =
neqjoinsel for <>
scalarltjoinsel for < or <=
scalargtjoinsel for > or >=
areajoinsel for 2D area-based comparisons
positionjoinsel for 2D position-based comparisons
contjoinsel for 2D containment-based comparisons

31.13.5. HASHES

���������HASHES�Ӿ䣬 �����ϵͳ����һ�����ڴ˲����������ӿ���ʹ�ù�ϣ��ɢ�У����ӡ� HASHESֻ�Է���boolean��˫Ŀ�����������壬 ����ʵ���ϸò���������Ƕ�ij���������͵���Ȳ�������

��ϣ��ɢ�У����ӵļ����ǣ� ����һ�Թ�ϣ��ɢ�У���ͬ���Ĺ�ϣ��ɢ�У����������Ҳ�����ֵ�������Ӳ�����ֻ�ܷ����档 �������ֵ���ŵ���ͬ�Ĺ�ϣͰ� ���ӽ��������Ƚ����ǣ���������ζ�����Ӳ������Ľ��һ���Ǽ١� ���Զ��ڲ�������ȵIJ�����������HASHES��û������ġ�

ʵ���ϣ��߼���Ȼ������ã��ò���������Ǵ�����ȫ�İ�λ��ȣ� ��Ϊ��ϣ�������Ը�ֵ���ڴ������ʽ���м����������Щλ�ĺ�����ʲô�� ���磬����β����� ~=�����������������Ƿ���ȣ� ���Ͳ��ǰ�λ��ȵģ���Ϊ��ʹ��������εĶ���������˳��ͬ�� ����Ҳ������Ϊ��������ȵġ� �����ζ�Ŷ���һ���� ~= �ڶԱ�����֮������ӣ� ����ù�ϣ����ʵ�ֽ�����ñ������ʵ�����ɲ�ͬ�Ľ���� ��Ϊ����ƥ��Ĵ󲿷����ݶԽ�����ϣ�ɲ�ͬ��ֵ������ᱻ��ϣ���ӽ��бȽϡ� ��������Ż���ѡ��ʹ�ò�ͬ�����ӷ����� ��ô����~=������˵��ȵ����ݶԶ��ᱻ�ҳ��������Dz���������ֲ�һ���ԣ� ��������û�б��~=Ϊ�ɹ�ϣ�ġ�

ͬʱ����һЩӲ����ص����ػᵼ��һ����ϣ���ӵļ������ ���磬����������������һ���ṹ���ṹ������в�����ע������λ�� ��ʱ������ȺŲ��������ΪHASHESҲ�Dz���ȫ�ġ� ����������д���������������ȷ����Щδ�õ�λ�����㡣�������ǽ���IJ��ԡ��� ��һ�������Ǹ����������ͶԹ�ϣ����Ҳ�Dz���ȫ�ġ� �ڷ���IEEE�����׼�Ļ����ϣ�����������Dz�ͬ��ֵ����ͬ��λģʽ���� �������DZ�����Ϊ�Ƚ���ȡ����ԣ��������Ⱥű����ΪHASHES�� һ�������һ��������ܲ�����ϣ����ƥ�䣬�������������Ӵ��� ����Ӧ����ƥ��ġ�

�����ǣ� �����ֻ�ܰ�HASHES�����ã�������ã�memcmp() ʵ�ֵĵȺŲ�������

ע��: ��һ�� hashjoinable ����ɢ�����ӣ��IJ������²�ĺ������� ���Ϊ immutable �����õģ����� stable���ȶ��ģ���������� volatile����ʧ�ģ�����ôϵͳ ���Ӳ�����Щ��������ɢ�������С�

ע��: ���һ�� hashjoinable ����ɢ�����ӣ���һ���²㺯�����Ϊ�ϸ�ģ�strict���� ��ô�ú�������������Ҳ����˵�������κη� NULL ���룬��Ӧ�÷��� TRUE ���� FALSE���������� NULL�� �������ѭ�������IN ������ɢ���Ż����ܻ����ɴ���Ľ���� ���ر��ǣ����ݹ淶����ȷ�Ĵ𰸿����� NULL ��ʱ��IN ���ܻ᷵�� FALSE�� ��������������һ�����󣬱�Թ˵���� NULL ���û��˼��׼������

31.13.6. MERGES (SORT1, SORT2, LTCMP, GTCMP)

���������SORT�Ӿ䣬 �����ϵͳ�Ի���Ŀǰ�IJ���������ʹ���ں����ӷ����� MERGESֻ�ǶԷ��� boolean ��˫Ŀ�����������壬 ʵ�����������������ijЩ�������ͻ���ij���������ͱ����ʾ��ȡ�

�ں��������������ĸ���Ϊ�����ģ� ����ߺ��ұߵı��������Ȼ���е�ɨ�����ǡ����ԣ������������Ͷ��������ܹ���ȫ����ģ� �������Ӳ���������ֻ����Щ��������˳���е�"ij��λ��"����ֵ�Գɹ��� ʵ��������ζ�����Ӳ�����������ֵ�����ڡ� ���Ǻ͹�ϣ���Ӳ�ͬ����ϣ��������ߺ��ұߵ����������������ͬ�ģ������ǰ�λ��ȣ��� ���Զ����ֲ�ͬ�������ͽ����ں����� -- ֻҪ�����߼���ȼ��ɡ� ���磬smallint��integer����Ȳ������ǿ������ں����ӵġ� ����ֻ��Ҫ���԰����������������г��߼��ɱȵ����е�������������ɡ�

�ں����ӵ�ִ��Ҫ��ϵͳ���Ա�ʶ�������ں���������Բ�������صIJ������� �������ֱ߲������������͵�С�ڱȽϣ��������ֱ߲������������͵�С�ڱȽϣ� ��������������֮���С�ڱȽϣ��Լ���������������֮��Ĵ��ڱȽϡ� ����������ں����ӵIJ�������������ͬ�IJ������������ͣ���ô����ʵ���������ֲ�ͬ�IJ������� �������������������ͬ����ô����С�ڲ�����������ͬ�IJ��������� ���ǿ���ͨ���������������Щ���������ֱ��� SORT1�� SORT2��LTCMP���Լ� GTCMP ѡ� ����������� MERGES ��ͬʱȴʡ�������е��κ�һ���� ��ôϵͳ�����ȱʡ������ <��<��<�� >��ͬ������������ֲ�����ѡ���е��κγ��֣� ��ô������MERGES Ϊ�����ģ� ������ǿ���ֻ��������һ���ֲ�����Ȼ����ϵͳ��������ġ�

���ֱȽϲ������IJ��������Ϳ��Դӿ��ں����ӵIJ������IJ��������͹��ɳ����� ��ˣ��� COMMUTATOR һ��������ֻ��Ҫ����Щ�Ӿ��и������������� ������ʹ�����ض�ѡȡ�IJ�����������ôдһ�� MERGES Ȼ����ϵͳ���ϸ�ھ��㹻�ˡ����� COMMUTATOR �Լ� NEGATOR һ�������������������������ǰ����������Բ���������ôϵͳ��������α��������¼����

����һЩ������Ϊ���ں����ӵIJ������ĸ������ơ� ��Щ����Ŀǰû�б�CREATE OPERATOR��飬 �����������֮һ��Ϊ��Ļ����ں����ӻ�������ʱʧ�ܣ�

ע��: ��һ�����ں����ӣ�mergejoinable���IJ������²�ĺ���������Ϊ���ã�immutable�������ȶ���stable���� ���������ʧ�ģ���ôϵͳ���Ӳ�ʹ�����������ں����ӡ�

ע��: GROUP BY �� DISTINCT ����Ҫ��ÿ����������߱Ƚϵ��������Ͷ���һ�����ں����ӵ�����Բ����������� =�� ����Բ����������Ĺ��� SORT1 ����������ʵ����Щ������ ͬ������ص� SORT1 �������� ORDER BY ��ȱʡ�����������

ע��: ע�⣬�� PostgreSQL �汾 7.3 ��ǰ�� ��д MERGES �������ڣ�Ҫдһ�����ں����ӵIJ������� ���DZ�����ȷд�� SORT1 �� SORT2��ͬ���� LTCMP �� GTCMP ѡ������ڣ� ��Щ�������ֱ�д����Ӳ���� < �� >��