sql >> データベース >  >> RDS >> Sqlserver

WindowsAzureSQLデータベース-IDの自動増分列は値をスキップします

    これらのギャップを解消する必要がある場合は、ここで運が悪い可能性があります。

    新しいアプリケーションを開発/テストしているときに、この問題に自分でぶつかりました。 sql server 2012について読んだ内容に基づいて、ここでsqlazureで何が起こっているかを直感的に理解しています。sqlazureに関するこれに関するドキュメントは見つかりませんでした。

    私が読んだことから、これはバグIMOとして出くわす機能です。 SQL Server 2012で、Microsoftはシーケンスを作成する機能を追加しました。シーケンスは、1000のブロックで使用された値を記録します。したがって、シーケンスが進行中であったとしましょう... 1、2、3、4、5 ...その後、SQLサーバーが再起動します。シーケンスは、ブロック1-1000がすでに使用されているという事実をすでに保存しているので、次の1000にジャンプします。次の値は1001、1002、1003、1004です。これにより、パフォーマンスが向上します。シーケンスを使用するときに挿入しますが、異常なギャップが生じる可能性があります。あなたのシーケンスにはこれに対する解決策があります。シーケンスを指定するときは、一度に1000のブロックを保存しないように、「NOCACHE」パラメーターを追加します。 その他のドキュメントについては、こちらをご覧ください。

    これが問題になるのは、これと同じパラダイムを使用するようにID列が変更されたように見えることです。したがって、サーバー、またはこの場合はsql azureインスタンスが再起動すると、大きなブロックが「使用済み」としてキャッシュされるため、ID列に大きなギャップ(1000)が発生する可能性があります。 SQL Server 2012には、これに対する解決策があります。起動フラグt272を指定して、古いSQL Server2008r2パラダイムを使用するようにIDを戻すことができます。問題は、sql Azureでこれを指定する方法を知らないことです(不可能な場合があります)。ドキュメントが見つかりません。 このスレッドを参照してくださいSQLServer2012の詳細については。

    ここで、msdnのIDのドキュメントを確認してください。 具体的には、「サーバーの再起動またはその他の障害後の連続する値」のセクションです。内容は次のとおりです。

    したがって、連続する値が必要な場合は、ID列に依存する代わりに、nocacheを使用してシーケンスを指定してみてください。これを自分で試したことはありません。ただし、これをエンティティフレームワークで機能させるのに問題があるようです。

    これがあまり役に立たない場合は申し訳ありませんが、少なくともそれはあなたが経験していることに関するいくつかの情報です。



    1. .NetでのOracle接続プーリング

    2. mysqlからpostgresにアクセスする方法は?

    3. djangoアプリのHerokuプッシュはpsycopg2.extensionsという名前のモジュールを取得しません

    4. Java SEでのJPA:オブジェクト:[メール保護]は既知のエンティティタイプではありません