FIX: SQL Server 2005 でクエリを実行するときエラー メッセージ:「< IndexName > の一意なインデックスを持つオブジェクト < TableName > 内に重複するキー行を挿入できません」

Bug # 50001287 (SQL 修正プログラム)

現象

SQL Server 2005 では、クエリを実行するときに、次のエラー メッセージが表示されます。
エラー: 2601、レベル: 14、状態: 1

一意インデックス 'IndexName' を持つオブジェクト 'テーブル名' に重複するキー行を挿入することはできません。
この問題は、クエリに対して生成される実行プランには、以上 2,147, 483,648 の入力行を持つテーブルのスプール演算子が含まれている場合に発生します。

原因

この問題は、テーブル スプール演算子は、クエリの実行プランを生成するとき列に一意なクラスター化インデックスを作成するために発生します。入力ローの数を超えた場合 2,147, 483,648 クラスター化インデックスの uniquifier が実行されます。したがって、重複する行を挿入できないことを示すエラー メッセージが表示されます。

解決策

累積的な更新プログラムの情報

この問題に対する修正は、累積的な更新 2 で初めてリリースされました。この累積的な更新プログラム パッケージを SQL Server 2005 Service Pack 2 の入手方法に関する詳細については、マイクロソフト サポート技術情報の記事を表示するのには次の資料番号をクリックします。
936305関数形式は、SQL Server 2005 Service Pack 2 の 2 のパッケージを更新します。
注: ビルドは累積的であるため、各新しい修正プログラム リリースには、すべての修正プログラムが含まれていて、以前の SQL Server 2005 に含まれていたすべてのセキュリティ修正プログラムの更新プログラムのリリースします。マイクロソフトでは、この修正プログラムを含む最新の修正プログラム リリースを適用することを検討することをお勧めします。詳細については、次の文書番号をクリックして、マイクロソフト サポート技術情報の資料をご参照ください。
937137 SQL Server 2005 ビルド SQL Server 2005 Service Pack 2 がリリースされた後にリリースされました。
特定の SQL Server のサービス パックには、Microsoft SQL Server 2005 の修正プログラムが作成されます。SQL Server 2005 Service Pack 2 のインストールには、SQL Server 2005 Service Pack 2 修正プログラムを適用する必要があります。既定では、SQL Server のサービス パックで提供されているすべての修正プログラムは次の SQL Server のサービス パックに含まれます。

回避策

この問題を回避するのには、テーブル スプール演算子を回避するのには次の方法のいずれかを使用します。

注: 以下の方法を回避する例として、「関連情報」セクションで「この問題を再現する手順」セクションでの記載されているクエリを使用します。
  • 別のクエリでは別にしていない個別の集計を使用します。

    などの「関連情報」セクション例のクエリでクエリに分割 2 つの部分として次ように。
    --Part 1select t1.c1,sum(t2.c3)
    from t1
    inner join t2 on t1.c1=t2.c1
    group by t1.c1
    --Part 2
    select t1.c1 , count(distinct t1.c3)
    from t1
    inner join t2 on t1.c1=t2.c1
    group by t1.c1

  • テンポラリ ・ テーブルを使用します。
    1. 一時テーブルを作成します。
    2. 一時テーブルに集計する必要のある行を挿入します。
    3. 一時テーブルに対して集計を実行します。
  • いくつかのクエリ ヒントまたはインデックス オプティマイザー ヒントを使用してクエリを書き直すしようとしてください。テーブル スプール演算子を回避する方法があります。

状況

マイクロソフトは、この問題を「対象製品」セクションに記載されているマイクロソフト製品の問題として認識しています。

詳細

この修正プログラムは、この問題を検出し、このような状況で適切なエラー メッセージが発生するためのロジックを修正します。この修正プログラムを適用した後、この問題が発生した場合、次のエラー メッセージが表示されます。
システムによって生成された一意の最大値は重複するグループは、パーティション ID 'パーティション Id' のインデックスを超過しました。削除し、インデックスを再作成することがありますこの問題を解決します。それ以外の場合、別のクラスター化キーを使用します。

この問題を再現する手順を実行します。

  1. SQL Server Management Studio を開き、SQL Server 2005 のインスタンスに接続します。
  2. 新しいクエリを作成し、次のステートメントを実行します。
    if exists(select name from sysobjects where name=N't1' and xtype='U')drop table t1
    go
    create table t1
    ( c1 bigint identity,
    c2 char (10),
    c3 int ,
    c4 int)
    go

    if exists(select name from sysobjects where name=N't2' and xtype='U')
    drop table t2
    go
    create table t2
    ( c1 bigint identity,
    c2 char (10),
    c3 int ,
    c4 int)
    go

  3. 次のステートメントを実行します。
    set showplan_all ongo
    select t1.c1,sum(t2.c3), count(distinct t1.c3)
    from t1
    inner join t2 on t1.c1=t2.c1
    group by t1.c1
    go

    set showplan_all off
    go

次の手順を完了すると、次の実行プランが表示されます。
StmtText                                                                                                                                                                              StmtId      NodeId      Parent      PhysicalOp                     LogicalOp                      Argument                                                                                                                              DefinedValues                                                                           EstimateRows  EstimateIO    EstimateCPU   AvgRowSize  TotalSubtreeCost OutputList                                                                                          Warnings Type                                                             Parallel EstimateExecutions------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- ----------- ----------- ----------- ------------------------------ ------------------------------ ------------------------------------------------------------------------------------------------------------------------------------- --------------------------------------------------------------------------------------- ------------- ------------- ------------- ----------- ---------------- --------------------------------------------------------------------------------------------------- -------- ---------------------------------------------------------------- -------- ------------------
select t1.c1,sum(t2.c3), count(distinct t1.c3)
from t1
inner join t2 on t1.c1=t2.c1
group by t1.c1 1 1 0 NULL NULL 1 NULL 1 NULL NULL NULL 0.06636031 NULL NULL SELECT 0 NULL
|--Compute Scalar(DEFINE:([Test2].[dbo].[t1].[c1]=[Test2].[dbo].[t1].[c1])) 1 2 1 Compute Scalar Compute Scalar DEFINE:([Test2].[dbo].[t1].[c1]=[Test2].[dbo].[t1].[c1]) [Test2].[dbo].[t1].[c1]=[Test2].[dbo].[t1].[c1] 1 0 1E-07 23 0.06636031 [Test2].[dbo].[t1].[c1], [Expr1008], [Expr1009] NULL PLAN_ROW 0 1
|--Merge Join(Inner Join, MANY-TO-MANY MERGE:([Test2].[dbo].[t1].[c1])=([Test2].[dbo].[t1].[c1]), RESIDUAL:([Test2].[dbo].[t1].[c1] = [Test2].[dbo].[t1].[c1])) 1 3 2 Merge Join Inner Join MANY-TO-MANY MERGE:([Test2].[dbo].[t1].[c1])=([Test2].[dbo].[t1].[c1]), RESIDUAL:([Test2].[dbo].[t1].[c1] = [Test2].[dbo].[t1].[c1]) NULL 1 0.000313 0.00564738 23 0.06636021 [Expr1008], [Expr1009], [Test2].[dbo].[t1].[c1] NULL PLAN_ROW 0 1
|--Compute Scalar(DEFINE:([Test2].[dbo].[t1].[c1]=[Test2].[dbo].[t1].[c1])) 1 4 3 Compute Scalar Compute Scalar DEFINE:([Test2].[dbo].[t1].[c1]=[Test2].[dbo].[t1].[c1]) [Test2].[dbo].[t1].[c1]=[Test2].[dbo].[t1].[c1] 1 0 1E-07 19 0.03019842 [Expr1009], [Test2].[dbo].[t1].[c1] NULL PLAN_ROW 0 1
| |--Compute Scalar(DEFINE:([Expr1009]=CONVERT_IMPLICIT(int,[Expr1019],0))) 1 5 4 Compute Scalar Compute Scalar DEFINE:([Expr1009]=CONVERT_IMPLICIT(int,[Expr1019],0)) [Expr1009]=CONVERT_IMPLICIT(int,[Expr1019],0) 1 0 1.1E-06 19 0.03019832 [Test2].[dbo].[t1].[c1], [Expr1009] NULL PLAN_ROW 0 1
| |--Stream Aggregate(GROUP BY:([Test2].[dbo].[t1].[c1]) DEFINE:([Expr1019]=COUNT([Test2].[dbo].[t1].[c3]))) 1 6 5 Stream Aggregate Aggregate GROUP BY:([Test2].[dbo].[t1].[c1]) [Expr1019]=COUNT([Test2].[dbo].[t1].[c3]) 1 0 1.1E-06 19 0.03019832 [Test2].[dbo].[t1].[c1], [Expr1019] NULL PLAN_ROW 0 1
| |--Sort(DISTINCT ORDER BY:([Test2].[dbo].[t1].[c1] ASC, [Test2].[dbo].[t1].[c3] ASC)) 1 7 6 Sort Distinct Sort DISTINCT ORDER BY:([Test2].[dbo].[t1].[c1] ASC, [Test2].[dbo].[t1].[c3] ASC) NULL 1 0.01126126 0.000100019 19 0.03019721 [Test2].[dbo].[t1].[c1], [Test2].[dbo].[t1].[c3] NULL PLAN_ROW 0 1
| |--Table Spool 1 9 7 Table Spool Eager Spool NULL NULL 1 0.006579998 5.041407E-05 31 0.01883594 [Test2].[dbo].[t1].[c1], [Test2].[dbo].[t1].[c3], [Test2].[dbo].[t2].[c3] NULL PLAN_ROW 0 1
| |--Hash Match(Inner Join, HASH:([Test2].[dbo].[t2].[c1])=([Test2].[dbo].[t1].[c1]), RESIDUAL:([Test2].[dbo].[t2].[c1]=[Test2].[dbo].[t1].[c1])) 1 10 9 Hash Match Inner Join HASH:([Test2].[dbo].[t2].[c1])=([Test2].[dbo].[t1].[c1]), RESIDUAL:([Test2].[dbo].[t2].[c1]=[Test2].[dbo].[t1].[c1]) NULL 1 0 0.01777693 31 0.02434613 [Test2].[dbo].[t1].[c1], [Test2].[dbo].[t1].[c3], [Test2].[dbo].[t2].[c1], [Test2].[dbo].[t2].[c3] NULL PLAN_ROW 0 1
| |--Table Scan(OBJECT:([Test2].[dbo].[t2])) 1 11 10 Table Scan Table Scan OBJECT:([Test2].[dbo].[t2]) [Test2].[dbo].[t2].[c1], [Test2].[dbo].[t2].[c3] 1 0.003125 0.0001581 19 0.0032831 [Test2].[dbo].[t2].[c1], [Test2].[dbo].[t2].[c3] NULL PLAN_ROW 0 1
| |--Table Scan(OBJECT:([Test2].[dbo].[t1])) 1 12 10 Table Scan Table Scan OBJECT:([Test2].[dbo].[t1]) [Test2].[dbo].[t1].[c1], [Test2].[dbo].[t1].[c3] 1 0.003125 0.0001581 19 0.0032831 [Test2].[dbo].[t1].[c1], [Test2].[dbo].[t1].[c3] NULL PLAN_ROW 0 1
|--Compute Scalar(DEFINE:([Test2].[dbo].[t1].[c1]=[Test2].[dbo].[t1].[c1])) 1 26 3 Compute Scalar Compute Scalar DEFINE:([Test2].[dbo].[t1].[c1]=[Test2].[dbo].[t1].[c1]) [Test2].[dbo].[t1].[c1]=[Test2].[dbo].[t1].[c1] 1 0 1E-07 19 0.03019842 [Expr1008], [Test2].[dbo].[t1].[c1] NULL PLAN_ROW 0 1
|--Compute Scalar(DEFINE:([Expr1008]=CASE WHEN [Expr1020]=(0) THEN NULL ELSE [Expr1021] END)) 1 27 26 Compute Scalar Compute Scalar DEFINE:([Expr1008]=CASE WHEN [Expr1020]=(0) THEN NULL ELSE [Expr1021] END) [Expr1008]=CASE WHEN [Expr1020]=(0) THEN NULL ELSE [Expr1021] END 1 0 1.1E-06 19 0.03019832 [Test2].[dbo].[t1].[c1], [Expr1008] NULL PLAN_ROW 0 1
|--Stream Aggregate(GROUP BY:([Test2].[dbo].[t1].[c1]) DEFINE:([Expr1020]=COUNT_BIG([Test2].[dbo].[t2].[c3]), [Expr1021]=SUM([Test2].[dbo].[t2].[c3]))) 1 28 27 Stream Aggregate Aggregate GROUP BY:([Test2].[dbo].[t1].[c1]) [Expr1020]=COUNT_BIG([Test2].[dbo].[t2].[c3]), [Expr1021]=SUM([Test2].[dbo].[t2].[c3]) 1 0 1.1E-06 19 0.03019832 [Test2].[dbo].[t1].[c1], [Expr1020], [Expr1021] NULL PLAN_ROW 0 1
|--Sort(ORDER BY:([Test2].[dbo].[t1].[c1] ASC)) 1 29 28 Sort Sort ORDER BY:([Test2].[dbo].[t1].[c1] ASC) NULL 1 0.01126126 0.000100019 19 0.03019721 [Test2].[dbo].[t1].[c1], [Test2].[dbo].[t2].[c3] NULL PLAN_ROW 0 1
|--Table Spool 1 31 29 Table Spool Eager Spool NULL NULL 1 0.006579998 5.041407E-05 31 0.01883594 [Test2].[dbo].[t1].[c1], [Test2].[dbo].[t1].[c3], [Test2].[dbo].[t2].[c3] NULL PLAN_ROW 0 1

テスト テーブルの 1 つ以上 2,147, 483,648 行ある場合は、この問題が発生します。
プロパティ

文書番号:937533 - 最終更新日: 2017/02/02 - リビジョン: 1

Microsoft SQL Server 2005 Developer Edition, Microsoft SQL Server 2005 Enterprise Edition, Microsoft SQL Server 2005 Standard Edition, Microsoft SQL Server 2005 Standard X64 Edition, Microsoft SQL Server 2005 Standard Edition for Itanium Based Systems, Microsoft SQL Server 2005 Enterprise X64 Edition, Microsoft SQL Server 2005 Enterprise Edition for Itanium Based Systems

フィードバック