PostgreSQL 8.0.0 �����ĵ���PostgreSQL �й� ������ | ||||
---|---|---|---|---|
Prev | Fast Backward | Chapter 13. ������������ | Fast Forward | Next |
���ǿ�����һ���̶�������ȷ��JOIN����Ʋ�ѯ�滮���� Ҫ����Ϊʲô������£�����������ҪһЩ����֪ʶ��
�ڼ����Ӳ�ѯ�����
SELECT * FROM a,b,c WHERE a.id = b.id AND b.ref = c.id;
�滮���������κ�˳�����ɵ����Ӹ����ı� ���磬����������һ����ѯ�滮����WHERE�Ӿ� a.id = b.id �� A ���ӵ� B��Ȼ��������һ��WHERE�Ӿ�� C ���ӵ������������ ������Ҳ���������� B �� C Ȼ�������� A�� Ҳ�õ���������������Ҳ�������� A �� C Ȼ��ѽ���� B ���ӣ� ������ô��Ч�ʱȽϲ��Ϊ�������������� A �� C �ĵϿ������� ���ڲ�ѯ��û�п��õ�WHERE�Ӿ�����Ż������ӡ� ��PostgreSQL ִ��������������Ӷ����������������֮�䣬����������������������ȵó�һ��������� ��Ҫ��һ������Щ���ӷ�ʽ������������ͬ�Ľ��������ִ�п�����ȴ�����о�IJ�� ��ˣ��滮��������ǽ��м�鲢�ҳ����Ч�IJ�ѯ�滮��
�����ѯֻ�漰������������ô�ڲ�ѯ�ﲻ����̫����Ҫ���ǵ����ӡ� ����DZ�ڵ�����˳�����Ŀ���ű���Ŀ�����ӳ�ָ�����ӵ����ơ� ������ʮ�����ҵı��Ժ�ʵ���ϸ��������ܶ����п�����һ����������� ���������߸�����Ҫ�൱����ʱ����й滮�� �����̫������ı�PostgreSQL �滮��������������л�Ϊ�������������� �Լ��ٿ�������Ŀ�������ռ䣩�� ���л�����ֵ��������ʱ���� geqo_threshold ���õġ��� ������������ʱ���٣����Dz���һ�����ҵ���õĹ滮��
����ѯ�漰�ⲿ����ʱ���滮���Ͳ���Ը���ͨ���ڲ���������ô�����ˡ� ���磬�������������ѯ
SELECT * FROM a LEFT JOIN (b JOIN c ON (b.ref = c.id)) ON (a.id = b.id);
���������ѯ��Լ����ǰ��һ���dz����ƣ������ǵ�����ȴ��ͬ�� ��Ϊ��� A �����κ�һ�в���ƥ�� B �� C ����������У� ��ô���ж�����������������滮��������˳��û��ʲôѡ�� ������������ B �� C��Ȼ��� A ���ӵ��ý���ϡ���ˣ� �����ѯ��ǰ��һ�����ڹ滮�ϵ�ʱ���١�
��ȷ���������INNER JOIN��CROSS JOIN�� ���������ε� JOIN�������Ϻͺ� FROM �� �г������ϵ��һ���ģ��������û�б�ҪԼ������˳�� �������ǿ��Ը��� PostgreSQL �IJ�ѯ�滮������ȷ���� JOIN ����Լ��˳�� ���磬����������ѯ�����ǵ�Ч�ģ�
SELECT * FROM a, b, c WHERE a.id = b.id AND b.ref = c.id; SELECT * FROM a CROSS JOIN b CROSS JOIN c WHERE a.id = b.id AND b.ref = c.id; SELECT * FROM a JOIN (b JOIN c ON (b.ref = c.id)) ON (a.id = b.id);
��������Ǹ��߹滮������ JOIN ��˳����ô�ڶ����͵���������Ҫ�ȵ�һ�����ڹ滮�ϵ�ʱ���١� ������ö���ֻ������������Ӷ�����������ģ� ��������Ŀ�ڶ�ı����ܾ��Ǿ��������ˡ�
Ҫǿ�ƹ滮��Ϊ�ڲ��������ѭ JOIN ˳�����ǿ�������ʱ���� join_collapse_limit ����Ϊ 1�� ���������ܵ���ֵ���������ۡ���
����ȫ����Ϊ����������ʱ����Լ������˳�� ��Ϊ��һ����FROM�б���ʹ��JOIN�������ͺܺ��ˡ� ���磬
SELECT * FROM a CROSS JOIN b, c, d, e WHERE ...;
������� join_collapse_limit = 1����ô��仰���൱��ǿ�ȹ滮���Ȱ� A ���ӵ� B��Ȼ�������ӵ������ı��ϣ� ������Լ��������ѡ���ڱ����У����ܵ�����˳�����Ŀ������ 5 ����
����������뷨���ǹ滮��������������һ�������õļ��ɣ� �����ǶԼ��ٹ滮ʱ�仹�Ƕ������滮�����ɺõĹ滮�����а����� ���ȱʡʱ�滮��ѡ����һ����������˳�� �������JOIN�ǿ����ѡ��һ�����õ� — ����֪��һ�����õ�˳���������ǽ�������顣
һ���dz������Ӱ��滮ʱ��������ǰ��Ӳ�ѯѹ�������ǵĸ���ѯ���档���磬��������IJ�ѯ
SELECT * FROM x, y, (SELECT * FROM a, b, c WHERE something) AS ss WHERE somethingelse;
���������������ְ������ӵ���ͼ�г��֣�����ͼ��SELECT�������뵽������ͼ�ij��ϣ����ɷdz���������IJ�ѯ�� ͨ�����滮������ͼ���Ӳ�ѯѹ��������ѯ�����
SELECT * FROM x, y, a, b, c WHERE something AND somethingelse;
����ͨ��������һ���ȶ������Ӳ�ѯ����Щ�Ĺ滮�� �����磬���� WHERE �����������Ȱ� X ���ӵ� A �ϣ������������� A �е�����У� ��˱������γ�ȫ���Ӳ�ѯ���������Ҫ��������ͬʱ�����������˹滮��ʱ�䣻 �����������һ������·���Ӵ���������������·���ӵ����⣬ �����IJ���Ǿ�ģ���Ϊ���ܵĹ滮�����ǰ���ָ�������ġ� �滮�����ڸ���ѯ���ܳ��� from_collapse_limit ��FROM���ʱ����ѹ���Ӳ�ѯ�� �Դ������������������������⡣ �����ͨ�������������ʱ�������ڹ滮ʱ��滮����֮������ƽ�⡣
from_collapse_limit �� join_collapse_limit ��������ʱ��Ϊ�����������鼸����ͬ��һ�����ƹ滮�ں�ʱ���Ӳ�ѯ"ƽ�滯"�� ����һ�����ƺ�ʱ����ȷ��������ƽ�滯��ͨ������Ҫô�� join_collapse_limit ���óɺ� from_collapse_limit һ������������ȷ���Ӻ��Ӳ�ѯ����Ϊ���ƣ�Ҫô�� join_collapse_limit ����Ϊ 1�������������ȷ���ӿ�������˳�� ����������������óɲ�ͬ��ֵ��������Ϳ����ڹ滮ʱ�������ʱ��֮�������ϸ�ĵ��ڡ�