⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 create_index.sgml

📁 postgresql8.3.4源码,开源数据库
💻 SGML
📖 第 1 页 / 共 2 页
字号:
   <variablelist>   <varlistentry>    <term><literal>FILLFACTOR</></term>    <listitem>     <para>      The fillfactor for an index is a percentage that determines how full      the index method will try to pack index pages.  For B-trees, leaf pages      are filled to this percentage during initial index build, and also      when extending the index at the right (largest key values).  If pages      subsequently become completely full, they will be split, leading to      gradual degradation in the index's efficiency.  B-trees use a default      fillfactor of 90, but any value from 10 to 100 can be selected.      If the table is static then fillfactor 100 is best to minimize the      index's physical size, but for heavily updated tables a smaller      fillfactor is better to minimize the need for page splits.  The      other index methods use fillfactor in different but roughly analogous      ways; the default fillfactor varies between methods.     </para>    </listitem>   </varlistentry>   </variablelist>  </refsect2>  <refsect2 id="SQL-CREATEINDEX-CONCURRENTLY">   <title id="SQL-CREATEINDEX-CONCURRENTLY-title">Building Indexes Concurrently</title>   <indexterm zone="SQL-CREATEINDEX-CONCURRENTLY">   <primary>index</primary>   <secondary>building concurrently</secondary>   </indexterm>   <para>    Creating an index can interfere with regular operation of a database.    Normally <productname>PostgreSQL</> locks the table to be indexed against    writes and performs the entire index build with a single scan of the    table. Other transactions can still read the table, but if they try to    insert, update, or delete rows in the table they will block until the    index build is finished. This could have a severe effect if the system is    a live production database.  Very large tables can take many hours to be    indexed, and even for smaller tables, an index build can lock out writers    for periods that are unacceptably long for a production system.   </para>   <para>    <productname>PostgreSQL</> supports building indexes without locking    out writes.  This method is invoked by specifying the    <literal>CONCURRENTLY</> option of <command>CREATE INDEX</>.    When this option is used,    <productname>PostgreSQL</> must perform two scans of the table, and in    addition it must wait for all existing transactions that could potentially    use the index to terminate.  Thus    this method requires more total work than a standard index build and takes    significantly longer to complete.  However, since it allows normal    operations to continue while the index is built, this method is useful for    adding new indexes in a production environment.  Of course, the extra CPU    and I/O load imposed by the index creation might slow other operations.   </para>   <para>    In a concurrent index build, the index is actually entered into the    system catalogs in one transaction, then the two table scans occur in a    second and third transaction.    If a problem arises while scanning the table, such as a    uniqueness violation in a unique index, the <command>CREATE INDEX</>    command will fail but leave behind an <quote>invalid</> index. This index    will be ignored for querying purposes because it might be incomplete;    however it will still consume update overhead. The <application>psql</>    <command>\d</> command will mark such an index as <literal>INVALID</>:<programlisting>postgres=# \d tab       Table "public.tab" Column |  Type   | Modifiers --------+---------+----------- col    | integer | Indexes:    "idx" btree (col) INVALID</programlisting>    The recommended recovery    method in such cases is to drop the index and try again to perform    <command>CREATE INDEX CONCURRENTLY</>.  (Another possibility is to rebuild    the index with <command>REINDEX</>.  However, since <command>REINDEX</>    does not support concurrent builds, this option is unlikely to seem    attractive.)   </para>   <para>    Another caveat when building a unique index concurrently is that the    uniqueness constraint is already being enforced against other transactions    when the second table scan begins.  This means that constraint violations    could be reported in other queries prior to the index becoming available    for use, or even in cases where the index build eventually fails.  Also,    if a failure does occur in the second scan, the <quote>invalid</> index    continues to enforce its uniqueness constraint afterwards.   </para>   <para>    Concurrent builds of expression indexes and partial indexes are supported.    Errors occurring in the evaluation of these expressions could cause    behavior similar to that described above for unique constraint violations.   </para>   <para>    Regular index builds permit other regular index builds on the    same table to occur in parallel, but only one concurrent index build    can occur on a table at a time.  In both cases, no other types of schema    modification on the table are allowed meanwhile.  Another difference    is that a regular <command>CREATE INDEX</> command can be performed within    a transaction block, but <command>CREATE INDEX CONCURRENTLY</> cannot.   </para>  </refsect2> </refsect1> <refsect1>  <title>Notes</title>  <para>   See <xref linkend="indexes"> for information about when indexes can   be used, when they are not used, and in which particular situations   they can be useful.  </para>  <para>   Currently, only the B-tree and GiST index methods support   multicolumn indexes. Up to 32 fields can be specified by default.   (This limit can be altered when building   <productname>PostgreSQL</productname>.)  Only B-tree currently   supports unique indexes.  </para>  <para>   An <firstterm>operator class</firstterm> can be specified for each   column of an index. The operator class identifies the operators to be   used by the index for that column. For example, a B-tree index on   four-byte integers would use the <literal>int4_ops</literal> class;   this operator class includes comparison functions for four-byte   integers. In practice the default operator class for the column's data   type is usually sufficient. The main point of having operator classes   is that for some data types, there could be more than one meaningful   ordering. For example, we might want to sort a complex-number data   type either by absolute value or by real part. We could do this by   defining two operator classes for the data type and then selecting   the proper class when making an index.  More information about   operator classes is in <xref linkend="indexes-opclass"> and in <xref   linkend="xindex">.  </para>  <para>   For index methods that support ordered scans (currently, only B-tree),   the optional clauses <literal>ASC</>, <literal>DESC</>, <literal>NULLS   FIRST</>, and/or <literal>NULLS LAST</> can be specified to reverse   the normal sort direction of the index.  Since an ordered index can be   scanned either forward or backward, it is not normally useful to create a    single-column <literal>DESC</> index &mdash; that sort ordering is already   available with a regular index.  The value of these options is that   multicolumn indexes can be created that match the sort ordering requested   by a mixed-ordering query, such as <literal>SELECT ... ORDER BY x ASC, y   DESC</>.  The <literal>NULLS</> options are useful if you need to support   <quote>nulls sort low</> behavior, rather than the default <quote>nulls   sort high</>, in queries that depend on indexes to avoid sorting steps.  </para>  <para>   Use <xref linkend="sql-dropindex" endterm="sql-dropindex-title">   to remove an index.  </para>  <para>   Prior releases of <productname>PostgreSQL</productname> also had an   R-tree index method.  This method has been removed because   it had no significant advantages over the GiST method.   If <literal>USING rtree</> is specified, <command>CREATE INDEX</>   will interpret it as <literal>USING gist</>, to simplify conversion   of old databases to GiST.  </para> </refsect1> <refsect1>  <title>Examples</title>  <para>   To create a B-tree index on the column <literal>title</literal> in   the table <literal>films</literal>:<programlisting>CREATE UNIQUE INDEX title_idx ON films (title);</programlisting>  </para>  <para>   To create an index on the expression <literal>lower(title)</>,   allowing efficient case-insensitive searches:<programlisting>CREATE INDEX lower_title_idx ON films ((lower(title)));</programlisting>  </para>  <para>   To create an index with non-default sort ordering of nulls:<programlisting>CREATE INDEX title_idx_nulls_low ON films (title NULLS FIRST);</programlisting>  </para>  <para>   To create an index with non-default fill factor:<programlisting>CREATE UNIQUE INDEX title_idx ON films (title) WITH (fillfactor = 70);</programlisting>  </para>  <para>   To create an index on the column <literal>code</> in the table   <literal>films</> and have the index reside in the tablespace   <literal>indexspace</>:<programlisting>CREATE INDEX code_idx ON films(code) TABLESPACE indexspace;</programlisting>  </para><!--<comment>Is this example correct?</comment>  <para>   To create a GiST index on a point attribute so that we   can efficiently use box operators on the result of the   conversion function:  <programlisting>CREATE INDEX pointloc    ON points USING GIST (point2box(location) box_ops);SELECT * FROM points    WHERE point2box(points.pointloc) = boxes.box;  </programlisting>  </para>-->  <para>   To create an index without locking out writes to the table:<programlisting>CREATE INDEX CONCURRENTLY sales_quantity_index ON sales_table (quantity);</programlisting>  </para> </refsect1> <refsect1>  <title>Compatibility</title>  <para>   <command>CREATE INDEX</command> is a   <productname>PostgreSQL</productname> language extension.  There   are no provisions for indexes in the SQL standard.  </para> </refsect1> <refsect1>  <title>See Also</title>  <simplelist type="inline">   <member><xref linkend="sql-alterindex" endterm="sql-alterindex-title"></member>   <member><xref linkend="sql-dropindex" endterm="sql-dropindex-title"></member>  </simplelist> </refsect1></refentry>

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -