3

私は現在、データ移行プロジェクトに取り組んでおり、パフォーマンス関連の問題のために、テーブルに ID を生成させるのではなく、一連の ID を事前に定義したいと考えています。

プロパティを列に追加するのは簡単ではないことがわかったので、ステートメントidentityを使用したいと思います。IDENTITY_INSERT ON

私の質問は次のとおりです。これにより、テーブルの ID テーブル (パフォーマンスに影響を与える) への更新が無効になりますか、それともidentity列のプロパティを本当に削除する必要がありますか?

4

2 に答える 2

10

データ移行スクリプトに次のようなものがあるのは非常に一般的です。

SET IDENTITY_INSERT [MyTable] ON
INSERT INTO [MyTable] ...
INSERT INTO [MyTable] ...
INSERT INTO [MyTable] ...
...
SET IDENTITY_INSERT [MyTable] OFF

有効にすると、フィールドは他の挿入に対して自動インクリメントしません。

IDENTITY_INSERT にはセッション スコープがあるため、セッションのみが ID 行に明示的に挿入できます。IDENTITY_INSERT を一度に ON にできるのは、セッション内の 1 つのテーブルだけです。

では、パフォーマンスはどうでしょうか。私は実際にあなたの質問に対する答えを持っていませんが、答えを与えるはずのコードがいくつかあります. ここで見つけたものの修正版です:

/* Create a table with an identity value */
CREATE TABLE test_table
  (
     auto_id  INT IDENTITY(1, 1),
     somedata VARCHAR(50)
  )
GO 

/* Insert 10 sample rows */
INSERT INTO test_table
SELECT 'x'
GO 10

/* Get the current identity value (10) */
SELECT Ident_current('test_table') AS IdentityValueAfterTenInserts

GO

/* Disable the identity column, insert a row, enable the identity column. */
SET identity_insert test_table ON
INSERT INTO test_table(auto_id, somedata)
SELECT 50, 'x'
SET identity_insert test_table OFF 

GO

/* Get the current identity value (50) */
SELECT Ident_current('test_table') AS IdentityValueAfterIdentityInsertWithIdentityEnabled

GO

/* Disable the identity column, insert a row, check the value, then enable the identity column. */
SET identity_insert test_table ON
INSERT INTO test_table(auto_id, somedata)
SELECT 100, 'x'

/* 
   Get the current identity value (?) 
   If the value is 50, then the identity column is only recalculated when a call is made to:
       SET identity_insert test_table OFF
   Else if the value is 100, then the identity column is recalculated constantly and your 
   performance problems remain.
*/
SELECT Ident_current('test_table') AS IdentityValueAfterIdentityInsertWithIdentityDisabled


SET identity_insert test_table OFF 

GO
/* Get the current identity value (100) */
SELECT Ident_current('test_table') AS IdentityValueAfterIdentityInsertWithIdentityEnabled

GO

DROP TABLE test_table

これを実行するのに便利な SQL SERVER を持っていないので、どうなるか教えてください。それが役に立てば幸い。

于 2011-03-10T10:36:39.667 に答える