Ich habe viele Probleme beim Hinzufügen einer einfachen Fremdschlüsseleinschränkung zu einer neu erstellten leeren Tabelle. Die Referenztabelle ist winzig mit weniger als 40 Datensätzen, aber sie wird ziemlich referenziert.Hinzufügen von Foreign Key Constraint saugt Speicher auf und verursacht Paging
Folgendes passiert: Neue Tabelle wird erfolgreich erstellt, aber wenn eine FK-Einschränkung hinzugefügt wird, "denkt" sie sehr lange und erhöht die CPU-Last. Die Speicherauslastung steigt, der Server beginnt wie verrückt zu paging und reagiert nicht mehr (Verbindungstimeout). Das Abbrechen der Abfrage hilft nicht. Das einzige, was funktioniert, ist ein Neustart des Servers, was sehr kostspielig ist.
Hier ist das Skript, das ich ausführen möchte. Ich hoffe, SQL-Server-Gurus können helfen. Danke!
USE [my_db]
GO
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE TABLE [dbo].[MyNewTable](
[Column1ID] [int] NOT NULL,
[Column2ID] [int] NOT NULL
) ON [PRIMARY]
GO
ALTER TABLE [dbo].[MyNewTable] WITH CHECK ADD CONSTRAINT [FK_MyNewTable_Column1ID] FOREIGN KEY([Column1ID])
REFERENCES [dbo].[ReferenceTable] ([Column1ID])
ON UPDATE CASCADE
ON DELETE CASCADE
GO
ALTER TABLE [dbo].[MyNewTable] CHECK CONSTRAINT [FK_MyNewTable_Column1ID]
GO
EDIT: ReferenceTable ist eine kleine Tabelle, die etwa wie folgt aussieht:
[Column1ID] [int] IDENTITY(1,1) NOT NULL,
[TxtCol1] [varchar](50) NOT NULL,
[TxtCol2] [varchar](50) NOT NULL,
[TxtCol3] [varchar](200) NOT NULL,
[TxtCol4] [nvarchar](2000) NOT NULL,
[TxtCol5] [varchar](200) NOT NULL,
[BitCol1] [bit] NOT NULL,
[TxtCol6] [varchar](200) NOT NULL,
[NumCol1] [smallint] NOT NULL,
[ExternalColumnId] [int] NOT NULL,
[NumCol2] [int] NOT NULL
Column1ID eine Menge von anderen Tabellen (FK ist) verwiesen wird. ExternalColumnId ist ein FK zu einer anderen Tabelle. Das Problem tritt während eines der ALTER TABLE-Aufrufe auf. Leider wurden beide zusammen geführt, so dass ich nicht sagen kann, welches das verursacht hat.
BEARBEITEN: Sobald der DB in den "Denkmodus" wechselt, ist es möglich, ihn wieder in den Einzelmodus und dann zurück in den Mehrbenutzermodus zu versetzen. Es ist viel besser als einen Neustart des Servers, aber immer noch inakzeptabel.
Seltsam. Was ist die Definition von 'ReferenzTabelle'? Nach welcher Aussage geht alles schief? Der 'ADD CONSTRAINT'? –
Gerade hinzugefügt mehr Info. Eine Sache, die ich in der ursprünglichen Tabelle nicht hatte, ist ein Primärschlüssel. Irgendeine Idee, wie viel Wirkung das haben würde, wenn man bedenkt, dass die neue Tabelle leer ist? –
Gbn ist richtig, und ich bin mir ziemlich sicher, dass Sie Objektverriegelung betrachten. War es reproduzierbar? Ich kenne sqlserver nicht genug, aber Sie könnten versuchen, einen neuen Tablespace zu erstellen, der von einer Datendatei in einem gemounteten Laufwerk bedient wird und prüft, ob das Problem existiert. (Ich nehme an, Oracle und SQL Server haben Parallelen;)) –