Update: Fehlermeldung beim Ausführen einer Abfrage in SQL Server 2005: "Legen Sie können keine Zeile mit doppeltem Schlüssel Objekt < Tabellenname > mit eindeutigen Index < IndexName >"

Fehler: #50001287 (SQL Hotfix)

Problembeschreibung

In SQL Server 2005 wird folgende Fehlermeldung, wenn Sie eine Abfrage ausführen:
Fehler: 2601, Schweregrad: 14, Status: 1

Zeile mit doppeltem Schlüssel kann nicht in Objekt 'Tabellenname' mit eindeutigen Index "IndexName" eingefügt werden.
Dieses Problem tritt auf, wenn der Ausführungsplan für die Abfrage generiert einen Table Spool -Operator, der mit maximal 2.147.483.648 Eingabezeilen enthält.

Ursache

Dieses Problem tritt auf, weil Table Spool -Operator erstellt einen eindeutigen gruppierten Index für eine Spalte, wenn der Ausführungsplan für die Abfrage generiert wird. Überschreitet die Anzahl der Eingabezeilen 2.147.483.648, läuft die Uniquifier für den gruppierten Index. Daher erhalten Sie die Fehlermeldung, die besagt, dass doppelte Zeilen eingefügt werden können.

Problemlösung

Kumulative Update-Informationen

Die Fehlerbehebung für dieses Problem wurde erstmals im kumulativen Update 2 veröffentlicht. Weitere Informationen zu diesem kumulativen Updatepaket für SQL Server 2005 Service Pack 2 finden Sie im folgenden Artikel der Microsoft Knowledge Base:
936305 kumulative Updatepaket 2 für SQL Server 2005 Service Pack 2
Hinweis Da diese Builds kumulativ sind, enthält jede neue Version alle Hotfixes und alle Sicherheitsupdates, die in früheren SQL Server 2005 enthalten waren. Microsoft empfiehlt, dass Sie prüfen die neueste Update-Version, die diesen Hotfix enthält. Klicken Sie für weitere Informationen auf die folgende Artikelnummer, um den Artikel in der Microsoft Knowledge Base anzuzeigen:
937137 der SQL Server 2005 erstellt, die nach der Freigabe von SQL Server 2005 Service Pack 2 veröffentlicht wurden
Microsoft SQL Server 2005-Hotfixes sind für bestimmte SQL Server Servicepacks erstellt. Sie müssen SQL Server 2005 Service Pack 2-Hotfix eine Installation von SQL Server 2005 Service Pack 2 anwenden. Standardmäßig ist jeder Hotfix, der in einem SQL Server Servicepack bereitgestellt wird, in einem nächsten Servicepack für SQL Server enthalten.

PROBLEMUMGEHUNG

Um dieses Problem zu umgehen, verwenden Sie eine der folgenden Methoden Table Spool -Operator zu.

Hinweis Die folgenden Methoden verwenden die Abfrage erwähnt wird im Abschnitt "Schritte zum Reproduzieren des Problems" im Abschnitt "Weitere Informationen" So umgehen.
  • Verwenden Sie unterschiedliche und nicht unterschiedliche Aggregationen in separate Abfragen.

    Beispielsweise in der Abfrage wird im Abschnitt "Weitere Informationen" Anhalten der Abfrage in zwei Teile wie folgt:
    --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

  • Verwenden Sie eine temporäre Tabelle:
    1. Erstellen Sie eine temporäre Tabelle.
    2. Legen Sie die Zeilen in der temporären Tabelle zusammengefasst werden.
    3. Führen Sie die Aggregationen für die temporäre Tabelle.
  • Versuchen Sie, einige Abfragehinweise oder Optimierungshinweise Index verwenden, um die Abfrage neu schreiben. Sie finden den Operator Table Spool vermieden.

Status

Microsoft hat bestätigt, dass es sich um ein Problem bei den Microsoft-Produkten handelt, die im Abschnitt „Eigenschaften“ aufgeführt sind.

Weitere Informationen

Dieser Hotfix behebt die Logik dieses Problem erkennen und in diesem Fall eine geeignete Fehlermeldung auslösen. Nach Installation dieses Hotfixes wird folgende Fehlermeldung, wenn dieses Problem auftritt:
Der vom System generierte eindeutige Maximalwert für eine doppelte Gruppe wurde für Index mit der Partitions-ID 'PartitionID' überschritten. Löschen und Neuerstellen des Index möglicherweise dadurch behoben; Verwenden Sie andernfalls überschritten.

Schritte zum Reproduzieren des Problems

  1. Öffnen Sie SQL Server Management Studio und Verbindung zu einer Instanz von SQL Server 2005.
  2. Erstellen Sie eine neue Abfrage, und führen Sie die folgenden Aussagen:
    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. Die folgende Anweisung ausführen:
    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

Wenn diese Schritte wird den folgende Ausführungsplan:
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

Wenn eines der Test maximal 2.147.483.648 Zeilen enthält, tritt dieses Problem.
Eigenschaften

Artikelnummer: 937533 – Letzte Überarbeitung: 14.01.2017 – Revision: 1

Feedback