<!--
$Header: /usr/prj/pg/cvsroot/doc/doc/src/sgml/ref/cluster.sgml,v 1.5 2001/09/03 05:07:12 i-kaori Exp $
Postgres documentation
-->

<refentry id="SQL-CLUSTER">
 <refmeta>
  <refentrytitle id="sql-cluster-title">
   CLUSTER
  </refentrytitle>
  <refmiscinfo>SQL<!-- Language Statements -->言語</refmiscinfo>
 </refmeta>
 <refnamediv>
  <refname>
   CLUSTER
  </refname>
  <refpurpose>
   <!-- Gives storage clustering advice to the server -->
   記憶領域のクラスタ構成情報をサーバーに供給します。<indexterm><primary>CLUSTER</primary></indexterm><indexterm><primary>SQL</primary><secondary>CLUSTER</secondary></indexterm><indexterm><primary sortas="でーたべーす">データベース</primary><secondary sortas="くらすた">クラスタ</secondary></indexterm><indexterm><primary sortas="くらすた">クラスタ</primary></indexterm>
 
  </refpurpose>
 </refnamediv>
 <refsynopsisdiv>
  <refsynopsisdivinfo>
   <date>1999-07-20</date>
  </refsynopsisdivinfo>
<synopsis>
CLUSTER <replaceable class="PARAMETER">indexname</replaceable> ON <replaceable class="PARAMETER">tablename</replaceable>
</synopsis>

  <refsect2 id="R2-SQL-CLUSTER-1">
   <refsect2info>
    <date>1998-09-08</date>
   </refsect2info>
   <title>
    <!-- Inputs -->入力
   </title>
   <para>
   </para>
   <variablelist>
    <varlistentry>
     <term><replaceable class="PARAMETER">indexname</replaceable></term>
     <listitem>
      <para>
       <!-- The name of an index. -->
       インデックスの名前です。
      </para>
     </listitem>
    </varlistentry>
    <varlistentry>
     <term><replaceable class="PARAMETER">table</replaceable></term>
     <listitem>
      <para>
       <!-- The name of a table. -->
       テーブルの名前です。
      </para>
     </listitem>
    </varlistentry>
   </variablelist>
  </refsect2>

  <refsect2 id="R2-SQL-CLUSTER-2">
   <refsect2info>
    <date>1998-09-08</date>
   </refsect2info>
   <title>
    <!-- Outputs -->出力
   </title>

    <variablelist>
     <varlistentry>
      <term><computeroutput>
CLUSTER
       </computeroutput></term>
      <listitem>
       <para>
	<!-- The clustering was done successfully. -->
         クラスタ構成が正常に終了しました。 
       </para>
      </listitem>
     </varlistentry>
     <varlistentry>
      <term><computeroutput>
ERROR: relation &lt;<replaceable class="PARAMETER">tablerelation_number</replaceable>&gt; inherits "<replaceable class="PARAMETER">table</replaceable>"
       </computeroutput></term>
      <listitem>
       <para>
	<comment>
         <!-- 
	 This is not documented anywhere. It seems not to be possible to
	 cluster a table that is inherited. -->

         この件についてはどこにも書かれていません。継承されたテーブルをクラスタ構成することができないのかもしれません。


	</comment>
       </para>
      </listitem>
     </varlistentry>
     <varlistentry>
      <term><computeroutput>
ERROR: Relation <replaceable class="PARAMETER">table</replaceable> does not exist!
       </computeroutput></term>
      <listitem>
       <para>
	<comment>
         <!-- 
	 The specified relation was not shown in the error message,
	 which contained a random string instead of the relation name.
         -->

         警告されたリレーションはエラーメッセージには表示されません。エラーメッセージにはリレーション名ではなくでたらめな文字列が入っています。 


	</comment>
       </para>
      </listitem>
     </varlistentry>
    </variablelist>
  </refsect2>
 </refsynopsisdiv>

 <refsect1 id="R1-SQL-CLUSTER-1">
  <refsect1info>
   <date>1998-09-08</date>
  </refsect1info>
  <title>
   <!-- Description -->説明
  </title>
  <para>
   <!--  
   <command>CLUSTER</command> instructs <productname>Postgres</productname> 
   to cluster the table specified
   by <replaceable class="parameter">table</replaceable> approximately
   based on the index specified by
   <replaceable class="parameter">indexname</replaceable>. The index must
   already have been defined on 
   <replaceable class="parameter">tablename</replaceable>. -->

   <command>CLUSTER</command>は、<replaceable class="parameter">indexname</replaceable>で指定されたインデックスにほぼ基づいた、<replaceable class="parameter">tablename</replaceable>で指定されたテーブルでクラスタ構成するように<productname>Postgres</productname>に指示します。インデックスは前もって<replaceable class="parameter">tablename</replaceable>で定義されていなければなりません。 

  </para>

  <para>
   <!-- When a table is clustered, it is physically reordered
   based on the index information. The clustering is static.
   In other words, as the table is updated, the changes are
   not clustered. No attempt is made to keep new instances or
   updated tuples clustered.  If one wishes, one can
   re-cluster manually by issuing the command again. -->

   テーブルがクラスタ構成されると、インデックス情報に基づいて物理的に再序列されます。クラスタ構成は静的です。別の表現をすると、テーブルが更新されても、その変更はクラスタ構成されません。新しいインスタンスやクラスタ構成済みのタプルへの更新は保存されません。保存したい場合、コマンドを再度入力し手作業で再クラスタ構成を行います。


  </para>

  <refsect2 id="R2-SQL-CLUSTER-3">
   <refsect2info>
    <date>1998-09-08</date>
   </refsect2info>
   <title>
    <!-- Notes -->注釈
   </title>

   <para>
    <!-- 
    The table is actually copied to a temporary table in index
    order, then renamed back to the original name.  For this
    reason, all grant permissions and other indexes are lost
    when clustering is performed. -->

    実際にはテーブルはインデックスの順序で一時テーブルにコピーされ、そして最初の名前に戻されます。この理由によって、すべての与えられた権限と他のインデックスはクラスタ構成が行われたときに失われます。


   </para>

   <para>
    <!-- In cases where you are accessing single rows randomly
    within a table, the actual order of the data in the heap
    table is unimportant. However, if you tend to access some
    data more than others, and there is an index that groups
    them together, you will benefit from using <command>CLUSTER</command>.
    -->

    あるテーブル内の1つの行をランダムにアクセスする場合、ヒープテーブル内のデータの実際の順序は重要でありません。とはいえ、テーブル内の特定のデータにより頻繁にアクセスする場合で、それらのデータをグループ化しているインデックスが存在するときは、<command>CLUSTER</command>を使うことによる利益を享受することができます。

   </para>

   <para> 
    <!--  
    Another place where <command>CLUSTER</command> is helpful is in
    cases where you use an
    index to pull out several rows from a table. If you are
    requesting a range of indexed values from a table, or a
    single indexed value that has multiple rows that match,
    <command>CLUSTER</command> will help because once the index identifies the
    heap page for the first row that matches, all other rows
    that match are probably already on the same heap page,
    saving disk accesses and speeding up the query. -->

    <command>CLUSTER</command>が役立つこれ以外の場合は、テーブルからいくつかの行を抽出するのにインデックスを使用するときです。テーブルからインデックスの値の範囲や、一致する複数の行を保有する1つのインデックスの値などを要求する場合、インデックスがひとたび最初に一致する行に対するヒープページを認識すると、一致するすべての他の行もおそらく同じヒープページに存在することになるので、<command>CLUSTER</command>はディスクアクセスを減らして問い合わせ処理の速度を速めます。 

   </para>

   <para>
    <!-- 
    There are two ways to cluster data. The first is with the
    <command>CLUSTER</command> command, which reorders the original table with
    the ordering of the index you specify. This can be slow
    on large tables because the rows are fetched from the heap
    in index order, and if the heap table is unordered, the
    entries are on random pages, so there is one disk page
    retrieved for every row moved. <productname>Postgres</productname> 
    has a cache, but the majority of a big table will not fit in the cache.
    -->

    データをクラスタ構成するには2つの方法があります。その1つは、<command>CLUSTER</command>コマンドでオリジナルのテーブルを指定したインデックスの順序によって再順序付けをする方法です。行はインデックスの順序におけるヒープから取り出されます。ヒープテーブルが順序付けらていない場合、項目はでたらめの順序のページ上に存在することになり、したがって、それぞれの移動させられた行に対し1つのディスクページが抽出されるため、大きなテーブルに対してこの方法を使うと遅い結果をもたらします。<productname>Postgres</productname>にはキャッシュがありますが大きなテーブルの大多数はキャッシュに収まり切れません。
   </para>

   <para> 
    <!-- Another way to cluster data is to use -->
    データをクラスタ構成するもう1つの方法は次のSQL文を実行することです。
</para>

<programlisting>
SELECT <replaceable class="parameter">columnlist</replaceable> INTO TABLE <replaceable class="parameter">newtable</replaceable>
     FROM <replaceable class="parameter">table</replaceable> ORDER BY <replaceable class="parameter">columnlist</replaceable>
</programlisting>

<para>
    <!--   
    which uses the <productname>Postgres</productname> sorting code in 
    the ORDER BY clause to match the index, and which is much faster for
    unordered data. You then drop the old table, use
    <command>ALTER TABLE/RENAME</command>
    to rename <replaceable class="parameter">temp</replaceable> to the old name, and
    recreate any indexes. The only problem is that <acronym>OID</acronym>s
    will not be preserved. From then on, <command>CLUSTER</command> should be
    fast because most of the heap data has already been
    ordered, and the existing index is used. -->

    これは<productname>Postgres</productname>のORDER BYのソートのコードをインデックスに一致させるために使用するので、順序付けられていないデータに対して高速です。その後、古いテーブルを削除し、<command>ALTER TABLE/RENAME</command>で<replaceable class="parameter">temp</replaceable>を前の名前に書き換えてから、どんなインデックスを再生成しても構いません。<acronym>OID</acronym>が保存されないのが唯一の問題点です。その後、<command>CLUSTER</command>はほとんどのヒープデータが順序付けられて、そこにあるインデックスが使用されるため、速くなるはずです。

   </para>
  </refsect2>
 </refsect1>

 <refsect1 id="R1-SQL-CLUSTER-2">
  <title>
   <!-- Usage -->使用方法
  </title>
  <para>
   <!-- 
   Cluster the employees relation on the basis of its salary attribute:
   -->
   給与属性に基づいて従業員リレーションをクラスタ構成するには以下のようにします。
 
  </para>
<programlisting>
CLUSTER emp_ind ON emp;
</programlisting>
 </refsect1>

 <refsect1 id="R1-SQL-CLUSTER-3">
  <title>
   <!-- Compatibility -->互換性
  </title>

  <refsect2 id="R2-SQL-CLUSTER-4">
   <refsect2info>
    <date>1998-09-08</date>
   </refsect2info>
   <title>
    SQL92
   </title>
   <para>
    <!-- 
    There is no <command>CLUSTER</command> statement in SQL92. -->
    SQL92には<command>CLUSTER</command>文はありません。

   </para>
  </refsect2>
 </refsect1>
</refentry>

<!-- Keep this comment at the end of the file
Local variables:
mode: sgml
sgml-omittag:nil
sgml-shorttag:t
sgml-minimize-attributes:nil
sgml-always-quote-attributes:t
sgml-indent-step:1
sgml-indent-data:t
sgml-parent-document:nil
sgml-default-dtd-file:"../reference.ced"
sgml-exposed-tags:nil
sgml-local-catalogs:"/usr/lib/sgml/catalog"
sgml-local-ecat-files:nil
End:
-->
