2016-07-07 5 views
1

データ型IDを持つID列を持つ頂点テーブルを作成しました。IDからID(1,1,1)へのALTERデータ型

問題は毎回セッションが閉じられているか、テーブルが(250000へのVerticaデフォルトでキャッシュ)ように500000、IDの値は250000にジャンプ切り捨て。私は、キャッシュを1に変更すると、これは問題ではないことを理解しています。

だから私の質問は、私たちがアイデンティティ(1,1,1)へのアイデンティティからデータ型を変更するには、列を変更することができる方法ですか?または、新しいテーブルを作成して、データをロードするだけのオプションがありますか?

ID列を再シードする方法はありますか?

答えて

1

どうすればいいか教えてください。それは本当に重要です。講演は事前にお詫び申し上げます。

さらに最近のバージョンのVerticaでは、IDENTITYまたはAUTO_INCREMENTの列を修正することはできません。少なくとも直接はありません。しかし、フードの下で生成されたシーケンスを変更することで、問題を解決することができます。

SELECT * FROM SEQUENCES 
WHERE identity_table_name = 'mytable'; 

次に、あなたはあなたのアイデンティティフィールド(あなたの列の名前を変更した場合は名前が一致しない場合があり、しかし)に対応して自動生成されたシーケンスを見つける必要があります:あなたの順序を検索するに

そこから変更してキャッシュの値を変更することができます。

ALTER SEQUENCE mytable_id_seq CACHE 1000; 

値を再開することもできます(トランケートの後など)。

ALTER SEQUENCE mytable_id_seq RESTART WITH 1; 

変更を有効にするには、これらの配列を使用しているすべてのセッションを再起動する必要があります。キャッシュがプルされると、そのキャッシュはセッションの一部として残ります。

しかし、私はVerticaの配列について何か言及することが本当に重要だと思っています。シーケンスキャッシュは本当に重要です。シーケンスからのすべてのキャッシュされていないプルは、グローバルカタログロックです。これは、あまりにも頻繁に行われると、クラスタ上で非常に重要な操作が実行されないようにします。

例として、あなたはその後、/挿入を行う回の束で選択1にキャッシュを設定しましょう。グローバルカタログを繰り返しロックしただけです。孤立していても、これは気付かないかもしれませんが、多くの仕事をしている忙しいクラスターでは、あなたは確かにそうなります。

もう1つの例は、セッション処理が貧弱です。ログインして行を挿入してログアウトするなど、狂ったようなことをしているとしましょう(単一行の挿入は一般的にVerticaには悪いという事実を忘れています)。あなたが持っているキャッシュの量に関係なく、カタログロックを繰り返し支払うことになります。

だから、あなたはあなたがにVerticaでそれらを使用する場合のシーケンスを使用する予定かの非常に注意してください。これに代わるもう一つの方法は、UUID(Verticaでは使用できません)を使用すること、HASH()を使用すること、データにアクセスするためにナチュラルキーを使用すること、またはデータがVerticaに到達する前にそれらを生成することです。

あなたは本当にだけしょっちゅう単一の行を挿入していない限り、これをしません。

もう1つ重要なことは、順序を順序付けの形式として実際に使用しないことです。これはベストプラクティスのものであり、どのデータベースでも真実です。まず、キャッシュブロックが使用されているので、並列にロードすると、それは実際には代表ではありません(並列シーケンスプルを行うことで悪化する以外の理由で、キャッシュはありません)。第二に、それはタイムスタンプのためのものです。これをデフォルトにすることもできます。

これは、シーケンスを使用するときに常にギャップが生じることを意味します。シーケンスギャップを引き起こす状況が多すぎます。これはどんなデータベースでもあてになります。私は間違っている可能性がありますが、データベースのロールバック・シーケンスがトランザクションのロールバックを引き出すとは思われません。

+0

したがって、VerticaのIDENTITY列を再入力/リセットする直接の方法はありませんか? SEQUENCESを使用しても、 '1で再始動'は、上記のシーケンスのキャッシュを1に制限した場合にのみ機能します。 – NitheshKHP

+0

再始動はできます。上記の同じプロセスが動作するはずです。あなたがキャッシュを1に設定しても、私は本当に唯一の作業に従いません。それはあなたがそれを伝えるものにリセットしますが、キャッシュの値は、すべてのセッションごとに常にその数多くのシーケンス番号を取得します。 – woot

+0

私はあなたのキャッシュに1つの部分を集中させたかもしれません。あなたが探しているのは、切り捨てでリセットすることです(忘れずに... 1で再起動します)。しかし、キャッシュはまだ大きなギャップを作成します。上記の理由から、キャッシュを1に設定しません。 – woot

関連する問題