2012-03-19 9 views
34

現在、インデックスに4列を使用しているテーブルにUNIQUE, NON CLUSTEREDインデックスがあります。SQL Server:ユニークなインデックスに列を追加するためのalter indexステートメントの作成方法

このインデックスに別の列を追加するだけのalterスクリプトを作成したいとします。新しい列タイプはvarcharです。

データベースはSQL Server 2005です。

ありがとうございます。

+2

私は何か不足していると確信していますが、なぜDROP INDEXテーブルを使用できないのですか? ;ユニークインデックスを作成するテーブル(Col1、Col2、Col3、Col4) ' –

+0

@Lieven、私もこれについて考えていました。テーブル内の既存のデータでインデックスを安全に削除してから作成することは可能ですか? –

+1

はい。インデックスを自由に削除して作成できます。インデックスがなくなってもクエリを実行するとパフォーマンスが低下することがありますが、(クラスタ化されていない)インデックスを削除して作成すると、テーブルに格納されている実際のデータには何の影響もありません。あなたのデータの物理的な順序ですが、** no **データは失われます)* –

答えて

63

あなたは、インデックスを変更することはできません - あなたができることすべてが

  1. は、その中に追加の列を持つ新しいインデックス再作成し、古いインデックス(DROP INDEX (indexname) ON (tablename)
  2. をドロップです:

    CREATE UNIQUE NONCLUSTERED INDEX (indexname) 
        ON dbo.YourTableName(columns to include) 
    

SQL ServerのALTER INDEXステートメントは、存在する特定のプロパティ(格納プロパティなど)を変更するために使用できますg索引を作成しますが、索引を構成する列は変更できません。

+1

Marc、あなたの提案されたソリューションがうまくいき、私たちのチームのDBAの承認を受けたスクリプト。 –

+35

今、あなたは私を困惑させてしまっています...あなたのチームにDBAを持っているのであれば、なぜ質問しますか? –

+3

MSDNのCreate IndexページでDROP_EXISTINGを調べます。特定の制限がある場合は、索引を変更できます。ポールホワイトの返事を見てください。 http://www.sqlservercentral.com/Forums/Topic913722-391-1.aspx – Gabe

3

インデックスに追加する新しい列が列のリストの末尾にある場合、つまり古いインデックスの列リストが新しいインデックスの列リストのプレフィックスである場合は、古い列でソートされた列は、新しい列によってソートされます。 Sybase SQL Serverおよびおそらく古いバージョンのMicrosoft SQL Serverには、行がすでにソートされていることを宣言するためのwith sorted_dataオプションがありました。しかし、MSSQL 2008 R2では効果がないようです。オプションは受け入れられますが、暗黙のうちに無視されます。いずれにしても、このオプションは主にクラスタ化インデックスで役立つと思います。

その他はwith drop_existingと言われましたが、これは素晴らしいとは言えますが、より高価なバージョンのMSSQLのみです。

+1

'with sorted_data'はどこから取得していますか?私は 'sorted_data'がそのステートメントのSQL Server 2008+文書の' create index'ステートメントの 'with '、別名「relational_index_option」としてリストされているとは見ません([link](https:// docs。 microsoft.com/en-us/sql/t-sql/statements/create-index-transact-sql))。 – Tom

+1

'with sorted_data'は、旧来のSybase SQL Serverから覚えていることです。 Microsoftは、Sybaseがサポートしているファンキーなインデックス作成オプションの一部を削除しましたが、これは使用できませんでした。しかし、MSSQL 2008 R2の簡単な実験では、これは今やノーオペレーションである可能性があります。テーブル内のデータがソートされていない場合はエラーは発生しません。だから私は私の答えを修正します。 –

+0

クイック検索では、このオプションはMSSQL 2000用に文書化されています。 –

関連する問題