11.11. ֻ��������ɨ��

PostgreSQL�е�������������������������ʾÿһ�����������洢�ڱ���������������PostgreSQL�����б���Ϊ�ñ�������֮�⡣����ζ����һ����ͨ����ɨ���У�ÿ��ȡһ����Ҫ�������Ͷ���ȡ�����ݡ����⣬��Ȼ����һ�������Ŀ�����WHERE������������ͨ���������ж���£��һ�𣬵������������õı��п��ֲܷ��ڶ��е��κεط������һ������ɨ��Ķѷ��ʲ��ֿ��ܻ��漰���ܶ�Զѵ�������ʣ�����ܻ�����������ڴ�ͳ�Ĵ����ϣ����� 11.5 ����������λͼɨ����ͼͨ�������ִ�жѷ������������ֿ���������Ч��Ҳ���������ѣ���

Ϊ�˽�������������⣬PostgreSQL֧��ֻ��������ɨ��������ɨ����Խ���һ���������ش��ѯ���������κζѷ��ʡ������˼����ֱ�Ӵ�ÿһ����������ֱ�ӷ���ֵ��������ȥ�ο���صĶ����ʹ�����ַ���ʱ���������������ƣ�

  1. �������ͱ���֧��ֻ��������ɨ�衣B-����������֧��ֻ��������ɨ�衣GiST �� SP-GiST ����ֻ��ijЩ��������֧��ֻ��������ɨ�衣�����������Ͳ�֧������ɨ�衣�ײ��Ҫ�������������������ϴ洢���߿����ع���ÿһ���������Ӧ��ԭʼ����ֵ��GIN ������һ����֧��ֻ��������ɨ��ķ�������Ϊ����ÿһ��������ͨ��ֻ����ԭʼ����ֵ��һ���֡�

  2. ��ѯ����ֻ���ô洢�ڸ������е��С����磬���������������ڱ�����x��y�ϣ����ñ�����һ����z����Щ��ѯ����ʹ��ֻ��������ɨ�裺

    SELECT x, y FROM tab WHERE x = 'key';
    SELECT x FROM tab WHERE x = 'key' AND y < 42;

    ������Щ��ѯ����ʹ��ֻ�������IJ�ѯ��

    SELECT x, z FROM tab WHERE x = 'key';
    SELECT x FROM tab WHERE x = 'key' AND z < 42;

    �������������۵ģ�����ʽ�����Ͳ���������������������Ӹ��ӣ���

�����������������Ҫ����ô�ò�ѯ��Ҫ�����������ֵ�����Դ������õ�����˲ſ���ʹ��ֻ��������ɨ�衣���Ƕ�PostgreSQL�е��κα�ɨ�軹��һ�������Ҫ�󣺱�����֤ÿһ�����������жԸò�ѯ�� MVCC ������"�ɼ���"������ 13 �������۵��������ɼ�����Ϣ�����洢���������У�ֻ�洢�ڶ����С���ˣ�էһ���ƺ�ÿһ���м���������ζ���Ҫ��һ�ζѷ��ʡ��������������޸Ĺ���ȷʵ�����������ǣ����ں��ٸ��ĵ�������һ�ַ������Խ��������⡣PostgreSQLΪ�����е�ÿһ��ҳ������Ƿ��������е��е����䶼�㹻�������ڶ����е�ǰ�Լ�δ�������񶼿ɼ��������Ϣ�洢�ڸñ����ɼ���ӳ����һ��λ�С����ҵ�һ����ѡ�������ֻ��������ɨ������Ӧ��ҳ��Ŀɼ���ӳ��λ�������λ�����ã���ô��һ�о��ǿɼ��IJ��Ҹ����ݿ����ֱ�ӱ����ء������λû�б����ã���ô�ͱ�����ʶ�����ȷ����һ���Ƿ�ɼ����������������ڱ�׼����ɨ���û���������ơ��������ڳɹ�������£����ַ���Ҳ�ǰѶԶѵķ��ʻ����˶Կɼ���ӳ��ķ��ʡ��������ڿɼ���ӳ������������Ķ�ҪС�ĸ������������Է��ʿɼ���ӳ����������� I/O Ҫ�ٺܶࡣ�ڴ󲿷�����£��ɼ���ӳ�����ǻᱻ�������ڴ��еĻ����С�

��֮����Ȼ����������Ҫ������ʱ����ʹ��ֻ��������ɨ�裬����ֻ�иñ��Ķ�ҳ�����кܴ�һ���ֵġ����ж��ɼ���ӳ��λ������ʱ���������������ơ��������кܴ�һ�����в������ĵı��Ǻܳ����ģ���Ҳ����һ��ɨ����ʵ���зdz����á�

Ϊ����Ч��ʹ��ֻ��������ɨ�裬����ѡ�񴴽�ʱֻ��ǰ������ƥ��WHERE�Ӿ䣬���ú�����б���"�غ�"�������Է��ز�ѯ��������ݡ����磬�������Ҫ���������IJ�ѯ

SELECT y FROM tab WHERE x = 'key';

���������ѯ�Ĵ�ͳ������ֻ��x�ϴ���һ�����������ǣ���(x, y)�ϴ���һ���������Խ����ֲ�ѯʵ��Ϊֻ��������ɨ�衣����֮ǰ���۵ģ�����һ��������ֻ��x�ϵ�������������˿����������ֻ��֪���������Ǿ�̬ʱ���ַ����ž�����������ע�⣬����Ҫ��һ���ǣ�������Ӧ�ö�����(x, y)������(y, x)�ϡ�������Ϊ���ڴ󲿷��������ͣ��ر��� B-������˵��������ǰ�������е�����Ч�ʲ��ߡ�

ԭ���ϣ�ֻ��������ɨ����Ա����ڱ���ʽ���������磬����һ��f(x)�ϵ�������x��һ�����У������԰�

SELECT f(x) FROM tab WHERE f(x) < 1;

��Ϊֻ��������ɨ��ִ�У����f()��һ��������۰���ĺ��������dz�����������������PostgreSQL�Ĺ滮����ǰ����������ʱ�����Ǻܴ�����ֻ�����������в�ѯ����Ҫ��������ʱ���滮���Żῼ����ֻ��������ɨ����ִ��һ����ѯ������������У�������f(x)������֮�⣬��ѯ���������ֲ���Ҫx�����ǹ滮����������ʶ����һ�㣬�������ó�����ʹ��ֻ��������ɨ��Ľ��ۡ����ֻ��������ɨ���㹻�м�ֵ����һ�ֽ�������ǰѸ�����������(f(x), x)�ϣ����еڶ�����ʵ���ϲ����ᱻʹ�ã���ֻ������˵���滮������ʹ��ֻ��������ɨ����ѡ����Ŀ���DZ����ظ�����f(x)��һ������ľ�ʾ�ǹ滮����һ����Ѳ��ڿ�����WHERE�Ӿ��ж�f(x)��ʹ��ƥ�䵽�����С�ͨ�����������ּ򵥲�ѯ��һ�������������漰�����ӵIJ�ѯ�оͲ����ˡ���Щ���㽫��δ����PostgreSQL�汾��������

��������Ҳ��ֻ��������ɨ��֮��������Ȥ�Ĺ�ϵ�������� 11-3����չʾ�IJ���������

CREATE UNIQUE INDEX tests_success_constraint ON tests (subject, target)
    WHERE success;

ԭ���ϣ����ǿ��������������ʹ��ֻ��������ɨ���������ѯ

SELECT target FROM tests WHERE subject = 'some-subject' AND success;

������һ�����⣺WHERE�Ӿ����õ��Dz�����Ϊ��������е�success��������ˣ����ǿ���ʹ��ֻ��������ɨ�裬��Ϊ������ʱ�ƻ�����Ҫ���¼��WHERE�Ӿ���Ǹ����֣��ڸ��������ҵ���������ض�����success = true������ڼƻ��м��������ֵ���Ҫ�������ԡ�PostgreSQL 9.6 ���Ժ�İ汾����ʶ�����������������������ֻ��������ɨ�裬���Ǿɰ汾�޷���������