Frage

Ich habe eine Menge von Fragen eines einfachen Fremdschlüssel in eine neu erstellen leere Tabelle hinzufügen. Referenztabelle ist ein winziger mit weniger als 40 Datensätze drin, aber es wird ziemlich viel verwiesen wird.

Hier ist, was passiert: neue Tabelle erfolgreich erstellt wird, aber wenn eine FK-Einschränkung hinzufügen, es „denkt“ für eine wirklich lange Zeit und erhöht die CPU-Last. Speichernutzung steigt, startet der Server Paging wie verrückt und reagiert nicht mehr (Verbindungszeitüberschreitung). die Abfrage abbrechen nicht hilft. Das einzige, was funktioniert der Server neu gestartet wird, was sehr teuer ist.

Hier ist das Skript, das ich zu laufen bin versucht. Ich hoffe, dass SQL Server-Gurus helfen können. Thx!

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 ein kleiner Tisch sieht etwa so aus:

[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 wird eine Menge von anderen Tabellen (FK ist) verwiesen. ExternalColumnId ist ein FK an einem anderen Tisch. Das Problem tritt bei einem der TABLE Anrufen ALTER. Leider wurden zusammen diese beiden laufen, so dass ich nicht in der Lage bin zu sagen, welches sie verursacht hat.

EDIT: Nachdem die DB in „Denken“ Modus geht, ist es möglich, es zu Single-Mode sichern bringen durch Umschalten und dann zurück in dem Mehrbenutzermodus. Es ist viel besser, als der Server neu zu starten, aber immer noch nicht akzeptabel.

War es hilfreich?

Lösung

Random dachte: haben Sie eine Transaktion offen haben

Die ALTER TABLE wird exklusiven Zugang erfordern (wie die meisten DDL der Fall ist), und es könnte sein, dass es durch eine Schemasperre blockiert ist, was wiederum ReferenceTable blockiert, was wiederum andere Abfragen blockieren ...

Andere Tipps

Ich würde vorschlagen, jede Abfrage Batch isoliert ausgeführt werden.

Erstellen Sie zunächst die Tabelle und sehen, ob das gelingt.

Als nächstes versuchen, den Fremdschlüssel auf seiner eigenen Verwendung WITH NOCHECK statt WITH CHECK hinzufügen. WITH NOCHECK wird jede Bestätigung der Inhalte in MyNewTable.Column1ID gegen die Werte in der Spalte der referenzierten Tabelle unterdrücken, während die Randbedingung erstellt wird. Wenn MyNewTable leer ist oder nur wenige Zeilen hat, würde ich denke nicht, dass diese viel Wirkung haben würde, aber ich habe festgestellt Symptome wie Sie beschreiben -., Außer dass die Tabelle, die die neue Einschränkung immer in es Millionen von Zeilen hatte

Schließlich führen Sie Ihre letzte Partie versuchen WITH CHECK auf Ihrem neuen Zwang zu setzen. Wenn diese Sümpfe nach unten, können Sie nur das neue FK Set WITH NOCHECK verlassen müssen, aber das wird nicht empfohlen, da Einschränkungen definiert WITH NOCHECK vom Abfrageoptimierer ignoriert werden, bis sie Satz zurück zu WITH CHECK sind.

Wenn dieses Problem reproduzierbar ist, würde ich Ihnen vorschlagen, einen Microsoft Support-Fall zu öffnen. es ist ein Fehler sein kann und Sie es schlagen. Wenn es festgestellt, dass es sich um ein bekanntes Problem ist sie würden Sie die Gebühren erstatten für den Fall öffnen.

Eine Handvoll Dinge suchen in -. Keine Lösungen, aber sie könnten zu etwas führen

Gibt es irgendwelche Trigger definiert?

Ist die Datenbank zu der Zeit verwendet oder abgerufen werden Sie die neue Tabelle erstellen, oder ist es müßig?

Gibt es etwas (zum Zeitpunkt der Bereitstellung oder auf andere Weise) UPDATE Column1ID in der Referenztabelle oder löschen Zeilen in dieser Tabelle?

Sie haben einen Primärschlüssel oder eindeutige Einschränkung auf auf Column1ID in der Referenztabelle? (Sie haben noch eine aufgeführt, aber ich würde denken, SQL sofort fehlschlagen würde, wenn man nicht vorlag.)

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top