create_index.l
上传用户:blenddy
上传日期:2007-01-07
资源大小:6495k
文件大小:9k
源码类别:

数据库系统

开发平台:

Unix_Linux

  1. ." This is -*-nroff-*-
  2. ." XXX standard disclaimer belongs here....
  3. ." $Header: /usr/local/cvsroot/pgsql/src/man/Attic/create_index.l,v 1.12 1998/08/19 02:04:12 momjian Exp $
  4. .TH "CREATE INDEX" SQL 11/05/95 PostgreSQL PostgreSQL
  5. .SH NAME
  6. create index - construct a secondary index
  7. .SH SYNOPSIS
  8. .nf
  9. fBcreatefR [fBuniquefR] fBindexfR index-name
  10. fBonfR classname [fBusingfR am-name]
  11. fB(fR attname [type_class], ...fB )fR
  12. fBcreatefR [fBuniquefR] fBindexfR index-name
  13. fBonfR classname [fBusingfR am-name]
  14. fB(fR funcname fB(fR attname-1 { , attname-i } fB)fR type_class fB)fR
  15. .fi
  16. .SH DESCRIPTION
  17. This command constructs an index called
  18. .IR index-name.
  19. .PP
  20. .IR Am-name
  21. is the name of the access method which is used for the index.
  22. The default access method is btree.
  23. .PP
  24. In the first syntax shown above, the key fields for the index are
  25. specified as attribute names.  It may also have an associated
  26. .IR "operator class" .
  27. An operator class is used to specify the operators to be used for a
  28. particular index.
  29. For example, a btree index on four-byte integers would use the
  30. .IR int4_ops
  31. class; this operator class includes comparison functions for four-byte
  32. integers.
  33. The default operator class is the appropriate operator class for
  34. that field type.
  35. .PP
  36. fBNote:fR currently, only 
  37. .IR btree
  38. access method supports multi-attribute indices.
  39. Up to 7 keys may be specified.
  40. .PP
  41. In the second syntax shown above, an index can be defined on the
  42. result of a user-defined function
  43. .IR funcname
  44. applied to one or more attributes of a single class.  These
  45. .IR "functional indices"
  46. can be used to obtain fast access to data based on
  47. operators that would normally require some transformation to be
  48. applied to the base data.  For example, say you have an attribute in
  49. class *(lqmyclass*(rq called *(lqpt*(rq that consists of a 2D
  50. point type.  Now, suppose that you would like to index this attribute
  51. but you only have index operator classes for 2D polygon types.  You
  52. can define an index on the point attribute using a function that you
  53. write (call it *(lqpoint_to_polygon*(rq) and your existing polygon
  54. operator class; after that, queries using existing polygon operators
  55. that reference *(lqpoint_to_polygon(myclass.pt)*(rq on one side will
  56. use the precomputed polygons stored in the functional index instead of
  57. computing a polygon for each and every instance in *(lqmyclass*(rq
  58. and then comparing it to the value on the other side of the operator.
  59. Obviously, the decision to build a functional index represents a
  60. tradeoff between space (for the index) and execution time.
  61. .PP
  62. The fBuniquefR keyword causes the system to check for duplicate
  63. values when the index is created (if data already exist) and each
  64. time data is added.
  65. Attempts to insert or update non-duplicate data will generate an error.
  66. .PP
  67. Postgres provides btree, rtree and hash access methods for
  68. secondary indices.  The btree access method is an implementation of
  69. the Lehman-Yao high-concurrency btrees.  The rtree access method
  70. implements standard rtrees using Guttman's quadratic split algorithm.
  71. The hash access method is an implementation of Litwin's linear
  72. hashing.  We mention the algorithms used solely to indicate that all
  73. of these access methods are fully dynamic and do not have to be
  74. optimized periodically (as is the case with, for example, static hash
  75. access methods).
  76. .PP
  77. This list was generated from the Postgres system catalogs with the query:
  78. .nf
  79. SELECT am.amname AS acc_name,
  80.        opc.opcname AS ops_name,
  81.        opr.oprname AS ops_comp
  82. FROM   pg_am am, pg_amop amop, pg_opclass opc, pg_operator opr
  83. WHERE  amop.amopid = am.oid AND
  84.        amop.amopclaid = opc.oid AND
  85.        amop.amopopr = opr.oid
  86. ORDER BY acc_name, ops_name, ops_comp;
  87. acc_name|ops_name   |ops_comp
  88. --------+-----------+--------
  89. btree   |abstime_ops|<       
  90. btree   |abstime_ops|<=      
  91. btree   |abstime_ops|=       
  92. btree   |abstime_ops|>       
  93. btree   |abstime_ops|>=      
  94. btree   |bpchar_ops |<       
  95. btree   |bpchar_ops |<=      
  96. btree   |bpchar_ops |=       
  97. btree   |bpchar_ops |>       
  98. btree   |bpchar_ops |>=      
  99. btree   |char_ops   |<       
  100. btree   |char_ops   |<=      
  101. btree   |char_ops   |=       
  102. btree   |char_ops   |>       
  103. btree   |char_ops   |>=      
  104. btree   |date_ops   |<       
  105. btree   |date_ops   |<=      
  106. btree   |date_ops   |=       
  107. btree   |date_ops   |>       
  108. btree   |date_ops   |>=      
  109. btree   |float4_ops |<       
  110. btree   |float4_ops |<=      
  111. btree   |float4_ops |=       
  112. btree   |float4_ops |>       
  113. btree   |float4_ops |>=      
  114. btree   |float8_ops |<       
  115. btree   |float8_ops |<=      
  116. btree   |float8_ops |=       
  117. btree   |float8_ops |>       
  118. btree   |float8_ops |>=      
  119. btree   |int24_ops  |<       
  120. btree   |int24_ops  |<=      
  121. btree   |int24_ops  |=       
  122. btree   |int24_ops  |>       
  123. btree   |int24_ops  |>=      
  124. btree   |int2_ops   |<       
  125. btree   |int2_ops   |<=      
  126. btree   |int2_ops   |=       
  127. btree   |int2_ops   |>       
  128. btree   |int2_ops   |>=      
  129. btree   |int42_ops  |<       
  130. btree   |int42_ops  |<=      
  131. btree   |int42_ops  |=       
  132. btree   |int42_ops  |>       
  133. btree   |int42_ops  |>=      
  134. btree   |int4_ops   |<       
  135. btree   |int4_ops   |<=      
  136. btree   |int4_ops   |=       
  137. btree   |int4_ops   |>       
  138. btree   |int4_ops   |>=      
  139. btree   |name_ops   |<       
  140. btree   |name_ops   |<=      
  141. btree   |name_ops   |=       
  142. btree   |name_ops   |>       
  143. btree   |name_ops   |>=      
  144. btree   |oid_ops    |<       
  145. btree   |oid_ops    |<=      
  146. btree   |oid_ops    |=       
  147. btree   |oid_ops    |>       
  148. btree   |oid_ops    |>=      
  149. btree   |text_ops   |<       
  150. btree   |text_ops   |<=      
  151. btree   |text_ops   |=       
  152. btree   |text_ops   |>       
  153. btree   |text_ops   |>=      
  154. btree   |time_ops   |<       
  155. btree   |time_ops   |<=      
  156. btree   |time_ops   |=       
  157. btree   |time_ops   |>       
  158. btree   |time_ops   |>=      
  159. btree   |varchar_ops|<       
  160. btree   |varchar_ops|<=      
  161. btree   |varchar_ops|=       
  162. btree   |varchar_ops|>       
  163. btree   |varchar_ops|>=      
  164. hash    |bpchar_ops |=       
  165. hash    |char_ops   |=       
  166. hash    |date_ops   |=       
  167. hash    |float4_ops |=       
  168. hash    |float8_ops |=       
  169. hash    |int2_ops   |=       
  170. hash    |int4_ops   |=       
  171. hash    |name_ops   |=       
  172. hash    |oid_ops    |=       
  173. hash    |text_ops   |=       
  174. hash    |time_ops   |=       
  175. hash    |varchar_ops|=       
  176. rtree   |bigbox_ops |&&      
  177. rtree   |bigbox_ops |&<      
  178. rtree   |bigbox_ops |&>      
  179. rtree   |bigbox_ops |<<      
  180. rtree   |bigbox_ops |>>      
  181. rtree   |bigbox_ops |@       
  182. rtree   |bigbox_ops |~       
  183. rtree   |bigbox_ops |~=      
  184. rtree   |box_ops    |&&      
  185. rtree   |box_ops    |&<      
  186. rtree   |box_ops    |&>      
  187. rtree   |box_ops    |<<      
  188. rtree   |box_ops    |>>      
  189. rtree   |box_ops    |@       
  190. rtree   |box_ops    |~       
  191. rtree   |box_ops    |~=      
  192. rtree   |poly_ops   |&&      
  193. rtree   |poly_ops   |&<      
  194. rtree   |poly_ops   |&>      
  195. rtree   |poly_ops   |<<      
  196. rtree   |poly_ops   |>>      
  197. rtree   |poly_ops   |@       
  198. rtree   |poly_ops   |~       
  199. rtree   |poly_ops   |~=      
  200. .fi
  201. The
  202. .IR int24_ops
  203. operator class is useful for constructing indices on int2 data, and
  204. doing comparisons against int4 data in query qualifications.
  205. Similarly,
  206. .IR int42_ops
  207. support indices on int4 data that is to be compared against int2 data
  208. in queries.
  209. .PP
  210. .PP
  211. The Postgres query optimizer will consider using btree indices in a scan
  212. whenever an indexed attribute is involved in a comparison using one of:
  213. .nf
  214. <    <=    =    >=    >
  215. .fi
  216. Both box classes support indices on the *(lqbox*(rq datatype in
  217. Postgres.  The difference between them is that
  218. .IR bigbox_ops
  219. scales box coordinates down, to avoid floating point exceptions from
  220. doing multiplication, addition, and subtraction on very large
  221. floating-point coordinates.  If the field on which your rectangles lie
  222. is about 20,000 units square or larger, you should use
  223. .IR bigbox_ops .
  224. The
  225. .IR poly_ops
  226. operator class supports rtree indices on *(lqpolygon*(rq data.
  227. .PP
  228. The Postgres query optimizer will consider using an rtree index whenever
  229. an indexed attribute is involved in a comparison using one of:
  230. .nf
  231. <<    &<    &>    >>    @    ~=    &&
  232. .fi
  233. The Postgres query optimizer will consider using a hash index whenever
  234. an indexed attribute is involved in a comparison using the fB=fR operator.
  235. .SH EXAMPLES
  236. .nf
  237. --
  238. --Create a btree index on the emp class using the age attribute.
  239. --
  240. create index empindex on emp using btree (age int4_ops)
  241. .fi
  242. .nf
  243. --
  244. --Create a btree index on employee name.
  245. --
  246. create index empname
  247. on emp using btree (name name_ops)
  248. .fi
  249. .nf
  250. --
  251. --Create an rtree index on the bounding rectangle of cities.
  252. --
  253. create index cityrect
  254. on city using rtree (boundbox box_ops)
  255. .fi
  256. .nf
  257. --
  258. --Create a rtree index on a point attribute such that we
  259. --can efficiently use box operators on the result of the 
  260. --conversion function.  Such a qualification might look 
  261. --like "where point2box(points.pointloc) = boxes.box".
  262. --
  263. create index pointloc
  264. on points using rtree (point2box(location) box_ops)
  265. .nf