aboutsummaryrefslogtreecommitdiff
path: root/doc/man/create_index.l
diff options
context:
space:
mode:
Diffstat (limited to 'doc/man/create_index.l')
-rw-r--r--doc/man/create_index.l314
1 files changed, 314 insertions, 0 deletions
diff --git a/doc/man/create_index.l b/doc/man/create_index.l
new file mode 100644
index 00000000000..3b3bd58e997
--- /dev/null
+++ b/doc/man/create_index.l
@@ -0,0 +1,314 @@
+.\" This is -*-nroff-*-
+.\" XXX standard disclaimer belongs here....
+.\" $Header: /cvsroot/pgsql/doc/man/Attic/create_index.l,v 1.1.1.1 1996/08/18 22:14:21 scrappy Exp $
+.TH "CREATE INDEX" SQL 11/05/95 Postgres95 Postgres95
+.SH NAME
+create index \(em construct a secondary index
+.SH SYNOPSIS
+.nf
+\fBcreate\fR \fBindex\fR index-name
+ \fBon\fR classname \fBusing\fR am-name
+ \fB(\fR attname type_class \fB)\fR
+
+\fBcreate\fR \fBindex\fR index-name
+ \fBon\fR classname \fBusing\fR am-name
+ \fB(\fR funcname \fB(\fR attname\-1 { , attname\-i } \fB)\fR type_class \fB)\fR
+.fi
+.SH DESCRIPTION
+This command constructs an index called
+.IR index-name.
+.PP
+.IR Am-name
+is the name of the access method which is used for the index.
+.PP
+In the first syntax shown above, the key field for the index is
+specified as an attribute name and an associated
+.IR "operator class" .
+An operator class is used to specify the operators to be used for a
+particular index. For example, a btree index on four-byte integers
+would use the
+.IR int4_ops
+class; this operator class includes comparison functions for four-byte
+integers.
+.PP
+In the second syntax shown above, an index can be defined on the
+result of a user-defined function
+.IR funcname
+applied to one or more attributes of a single class. These
+.IR "functional indices"
+are primarily useful in two situations. First, functional indices can
+be used to simulate multikey indices. That is, the user can define a
+new base type (a simple combination of, say, \*(lqoid\*(rq and
+\*(lqint2\*(rq) and the associated functions and operators on this new
+type such that the access method can use it. Once this has been done,
+the standard techniques for interfacing new types to access methods
+(described in the Postgres user manual) can be applied. Second,
+functional indices can be used to obtain fast access to data based on
+operators that would normally require some transformation to be
+applied to the base data. For example, say you have an attribute in
+class \*(lqmyclass\*(rq called \*(lqpt\*(rq that consists of a 2D
+point type. Now, suppose that you would like to index this attribute
+but you only have index operator classes for 2D polygon types. You
+can define an index on the point attribute using a function that you
+write (call it \*(lqpoint_to_polygon\*(rq) and your existing polygon
+operator class; after that, queries using existing polygon operators
+that reference \*(lqpoint_to_polygon(myclass.pt)\*(rq on one side will
+use the precomputed polygons stored in the functional index instead of
+computing a polygon for each and every instance in \*(lqmyclass\*(rq
+and then comparing it to the value on the other side of the operator.
+Obviously, the decision to build a functional index represents a
+tradeoff between space (for the index) and execution time.
+.PP
+Postgres provides btree, rtree and hash access methods for
+secondary indices. The btree access method is an implementation of
+the Lehman-Yao high-concurrency btrees. The rtree access method
+implements standard rtrees using Guttman's quadratic split algorithm.
+The hash access method is an implementation of Litwin's linear
+hashing. We mention the algorithms used solely to indicate that all
+of these access methods are fully dynamic and do not have to be
+optimized periodically (as is the case with, for example, static hash
+access methods).
+.PP
+This list was generated from the Postgres system catalogs with the query:
+
+.nf
+SELECT am.amname AS acc_name,
+ opc.opcname AS ops_name,
+ opr.oprname AS ops_comp
+FROM pg_am am, pg_amop amop, pg_opclass opc, pg_operator opr
+WHERE amop.amopid = am.oid AND
+ amop.amopclaid = opc.oid AND
+ amop.amopopr = opr.oid
+ORDER BY acc_name, ops_name, ops_comp;
+
+acc_name|ops_name |ops_comp
+--------+-----------+--------
+btree |abstime_ops|<
+btree |abstime_ops|<=
+btree |abstime_ops|=
+btree |abstime_ops|>
+btree |abstime_ops|>=
+btree |bpchar_ops |<
+btree |bpchar_ops |<=
+btree |bpchar_ops |=
+btree |bpchar_ops |>
+btree |bpchar_ops |>=
+btree |char16_ops |<
+btree |char16_ops |<=
+btree |char16_ops |=
+btree |char16_ops |>
+btree |char16_ops |>=
+btree |char2_ops |<
+btree |char2_ops |<=
+btree |char2_ops |=
+btree |char2_ops |>
+btree |char2_ops |>=
+btree |char4_ops |<
+btree |char4_ops |<=
+btree |char4_ops |=
+btree |char4_ops |>
+btree |char4_ops |>=
+btree |char8_ops |<
+btree |char8_ops |<=
+btree |char8_ops |=
+btree |char8_ops |>
+btree |char8_ops |>=
+btree |char_ops |<
+btree |char_ops |<=
+btree |char_ops |=
+btree |char_ops |>
+btree |char_ops |>=
+btree |date_ops |<
+btree |date_ops |<=
+btree |date_ops |=
+btree |date_ops |>
+btree |date_ops |>=
+btree |float4_ops |<
+btree |float4_ops |<=
+btree |float4_ops |=
+btree |float4_ops |>
+btree |float4_ops |>=
+btree |float8_ops |<
+btree |float8_ops |<=
+btree |float8_ops |=
+btree |float8_ops |>
+btree |float8_ops |>=
+btree |int24_ops |<
+btree |int24_ops |<=
+btree |int24_ops |=
+btree |int24_ops |>
+btree |int24_ops |>=
+btree |int2_ops |<
+btree |int2_ops |<=
+btree |int2_ops |=
+btree |int2_ops |>
+btree |int2_ops |>=
+btree |int42_ops |<
+btree |int42_ops |<=
+btree |int42_ops |=
+btree |int42_ops |>
+btree |int42_ops |>=
+btree |int4_ops |<
+btree |int4_ops |<=
+btree |int4_ops |=
+btree |int4_ops |>
+btree |int4_ops |>=
+btree |name_ops |<
+btree |name_ops |<=
+btree |name_ops |=
+btree |name_ops |>
+btree |name_ops |>=
+btree |oid_ops |<
+btree |oid_ops |<=
+btree |oid_ops |=
+btree |oid_ops |>
+btree |oid_ops |>=
+btree |oidint2_ops|<
+btree |oidint2_ops|<=
+btree |oidint2_ops|=
+btree |oidint2_ops|>
+btree |oidint2_ops|>=
+btree |oidint4_ops|<
+btree |oidint4_ops|<=
+btree |oidint4_ops|=
+btree |oidint4_ops|>
+btree |oidint4_ops|>=
+btree |oidname_ops|<
+btree |oidname_ops|<=
+btree |oidname_ops|=
+btree |oidname_ops|>
+btree |oidname_ops|>=
+btree |text_ops |<
+btree |text_ops |<=
+btree |text_ops |=
+btree |text_ops |>
+btree |text_ops |>=
+btree |time_ops |<
+btree |time_ops |<=
+btree |time_ops |=
+btree |time_ops |>
+btree |time_ops |>=
+btree |varchar_ops|<
+btree |varchar_ops|<=
+btree |varchar_ops|=
+btree |varchar_ops|>
+btree |varchar_ops|>=
+hash |bpchar_ops |=
+hash |char16_ops |=
+hash |char2_ops |=
+hash |char4_ops |=
+hash |char8_ops |=
+hash |char_ops |=
+hash |date_ops |=
+hash |float4_ops |=
+hash |float8_ops |=
+hash |int2_ops |=
+hash |int4_ops |=
+hash |name_ops |=
+hash |oid_ops |=
+hash |text_ops |=
+hash |time_ops |=
+hash |varchar_ops|=
+rtree |bigbox_ops |&&
+rtree |bigbox_ops |&<
+rtree |bigbox_ops |&>
+rtree |bigbox_ops |<<
+rtree |bigbox_ops |>>
+rtree |bigbox_ops |@
+rtree |bigbox_ops |~
+rtree |bigbox_ops |~=
+rtree |box_ops |&&
+rtree |box_ops |&<
+rtree |box_ops |&>
+rtree |box_ops |<<
+rtree |box_ops |>>
+rtree |box_ops |@
+rtree |box_ops |~
+rtree |box_ops |~=
+rtree |poly_ops |&&
+rtree |poly_ops |&<
+rtree |poly_ops |&>
+rtree |poly_ops |<<
+rtree |poly_ops |>>
+rtree |poly_ops |@
+rtree |poly_ops |~
+rtree |poly_ops |~=
+
+.fi
+The
+.IR int24_ops
+operator class is useful for constructing indices on int2 data, and
+doing comparisons against int4 data in query qualifications.
+Similarly,
+.IR int42_ops
+support indices on int4 data that is to be compared against int2 data
+in queries.
+.PP
+The operator classes
+.IR oidint2_ops ,
+.IR oidint4_ops ,
+and
+.IR oidchar16_ops
+represent the use of
+.IR "functional indices"
+to simulate multi-key indices.
+.PP
+The Postgres query optimizer will consider using btree indices in a scan
+whenever an indexed attribute is involved in a comparison using one of:
+
+.nf
+< <= = >= >
+.fi
+
+Both box classes support indices on the \*(lqbox\*(rq datatype in
+Postgres. The difference between them is that
+.IR bigbox_ops
+scales box coordinates down, to avoid floating point exceptions from
+doing multiplication, addition, and subtraction on very large
+floating-point coordinates. If the field on which your rectangles lie
+is about 20,000 units square or larger, you should use
+.IR bigbox_ops .
+The
+.IR poly_ops
+operator class supports rtree indices on \*(lqpolygon\*(rq data.
+.PP
+The Postgres query optimizer will consider using an rtree index whenever
+an indexed attribute is involved in a comparison using one of:
+
+.nf
+<< &< &> >> @ ~= &&
+.fi
+
+The Postgres query optimizer will consider using a hash index whenever
+an indexed attribute is involved in a comparison using the \fB=\fR operator.
+.SH EXAMPLES
+.nf
+--
+--Create a btree index on the emp class using the age attribute.
+--
+create index empindex on emp using btree (age int4_ops)
+.fi
+.nf
+--
+--Create a btree index on employee name.
+--
+create index empname
+ on emp using btree (name char16_ops)
+.fi
+.nf
+--
+--Create an rtree index on the bounding rectangle of cities.
+--
+create index cityrect
+ on city using rtree (boundbox box_ops)
+.fi
+.nf
+--
+--Create a rtree index on a point attribute such that we
+--can efficiently use box operators on the result of the
+--conversion function. Such a qualification might look
+--like "where point2box(points.pointloc) = boxes.box".
+--
+create index pointloc
+ on points using rtree (point2box(location) box_ops)
+.nf