2016-11-18 15 views
2

私は私たちのプロジェクトにLiquibaseを使用しようとしています。主にOracleデータベースと他のデータベースを使用する頻度が少なくなります。私は、インデックスの場合に列の順序を指定する方法を見つけようとしています。以下は、典型的なcreate index change setです。LiquibaseのcreateIndexカラムの順序

<createIndex indexName="PK_xxxxxxx" tableName="xxxxx" unique="true"> 
    <column name="column_1"/> 
    <column name="column_2"/> 
    <column name="column_3"/> 
</createIndex> 

パフォーマンスとアプリケーションのスケーラビリティについては、インデックスの列の順序が大きく影響します。インデックスを作成する際に同じ方法を指定する方法があれば教えてください。

PS:列タグのドキュメントごとに、属性afterColumnpositionが存在し、それらはcreate tableにのみ適用されます。ここでは、それについて書かれているものがあります。

「addColumn」コマンドで使用する場合、この属性を使用すると、テーブルの列の順序で新しい列がどこに移動するかを制御できます。 beforeColumn、afterColumnまたはpositionのいずれか1つだけが許可されます。非常に多くのDBMSはcreate index文で指定された順序を使用していますように - createIndexタグに記載されている3.1

+0

。 createIndexコマンドを使用しています。 –

+0

@PeterHenellはい、作成テーブルでは、 'AfterColumn'または 'Position'属性を使用して列の順序が許可されます。私は同じものが 'CreateIndex'と一緒に使用できるかどうか疑問に思っていました。 –

+0

@a_horse_with_no_name、ありがとうございます。通常、XMLは 'order less'です。つまり、これらのXMLファイルを生成している間にXML操作用に他の標準ツールを使用すると、列が順番どおりになるという保証はありません。それがこの質問の理由でした。 –

答えて

1

のでLiquiBaseを、列の順序を使用します。

次のチェンジ:

<changeSet author="arthur" id="1"> 
    <createTable tableName="foo"> 
    <column name="col_1" type="integer"/> 
    <column name="col_2" type="integer"/> 
    <column name="col_3" type="integer"/> 
    </createTable> 
    <createIndex indexName="ix_one" tableName="foo"> 
    <column name="col_1"/> 
    <column name="col_2"/> 
    <column name="col_3"/> 
    </createIndex> 
    <createIndex indexName="ix_two" tableName="foo"> 
    <column name="col_3"/> 
    <column name="col_2"/> 
    <column name="col_1"/> 
    </createIndex> 
    <createIndex indexName="ix_three" tableName="foo"> 
    <column name="col_2"/> 
    <column name="col_3"/> 
    <column name="col_1"/> 
    </createIndex> 
</changeSet> 

は、次の文を(例えばupdateSQLを実行したときに)生成されます:あなたが引用されているドキュメントは、 "AddColumn関数" コマンドを参照している

CREATE TABLE public.foo (col_1 INT, col_2 INT, col_3 INT); 

CREATE INDEX ix_one ON public.foo(col_1, col_2, col_3); 

CREATE INDEX ix_two ON public.foo(col_3, col_2, col_1); 

CREATE INDEX ix_three ON public.foo(col_2, col_3, col_1); 
+0

こんにちは、以前にテストしました。 liquibaseは要素の順序を考慮していますが、他のXML処理ツールではそうではありません。例えば、私はliquibase用に入力されるXMLを生成するためにpythonを使用します。標準的なpython XML操作ライブラリは、 "STRICT"解析に従わず、タグをアルファベット順にソートしようとします。これは私の問題です。将来のバージョンでは、この問題を解決するインデックスを作成するための位置のような属性も存在します。ヘルプと明確化のおかげで再びありがとう。 –

+0

あなたが使用している「他のXML処理ツール」はバグです。 XML ***の要素の順序は***です。 XMLスキーマ(XSD)で_required_オーダーを定義することもできます.XSDと関連しない場合は不可能です。 –

+0

これは部分的に真です。 XSDがそのように述べている場合にのみ、XML問題の順序付けを行います。そうでない場合、通常のXMLでは、順序は関係ありません。このような議論のリンクです。 [does-xml-care-about-the-order-of-elements](http://stackoverflow.com/questions/4328867/does-xml-care-about-the-order-of-elements) –