Sql-Server

交易中非常慢的簡單 INSERT

  • April 2, 2019

我在我的 SQL Server 上進行了有問題的查詢,但我找不到問題。我有兩個簡單的表,一個用於“標題”,一個用於“項目”(每個都有一個 PK 列,總共五個欄位和一些 FK)。

我的客戶端應用程序執行以下操作:

  1. 打開 SQL Server 事務
  2. 插入標題行(1-5 毫秒)
  3. 插入第一個項目行(標題行的PK值為FK - 5000-20000ms!
  4. 插入第二個項目行(1-5 毫秒)
  5. 插入第 n 個項目行(1-5 毫秒)
  6. 犯罪
  7. 關閉交易

Header 表有大約 2000 個條目,Item 表大約有 6000 個。沒有定義額外的索引,沒有觸發器。這是一個測試系統,因此沒有太多其他負載/鎖定。我更新了統計數據。

有爭議的表聲明如下:


INSERT INTO MachineParameterDataItems (
 PlantID
, MachineParameterDataHeaderID
, MachineParameterSetConfigID
, Value
)
VALUES (
 @P0
, @P1
, @P2
, CASE WHEN @P3 = -1 THEN NULL ELSE @P4 END
)

表頭:


/****** Object:  Table [dbo].[MachineParameterDataHeaders]    Script Date: 01.04.2019 11:26:14 ******/
SET ANSI_NULLS ON
GO

SET QUOTED_IDENTIFIER ON
GO

CREATE TABLE [dbo].[MachineParameterDataHeaders](
   [MachineParameterDataHeaderID] [int] IDENTITY(1,1) NOT NULL,
   [PlantID] [smallint] NOT NULL,
   [MachineParameterSetID] [int] NOT NULL,
   [BatchID] [int] NULL,
   [CreationDateTime] [datetime2](7) NOT NULL,
PRIMARY KEY CLUSTERED 
(
   [MachineParameterDataHeaderID] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]
GO

ALTER TABLE [dbo].[MachineParameterDataHeaders]  WITH CHECK ADD  CONSTRAINT [FK__MachinePa__Batch__116A8EFB] FOREIGN KEY([BatchID])
REFERENCES [dbo].[Batches] ([BatchID])
GO

ALTER TABLE [dbo].[MachineParameterDataHeaders] CHECK CONSTRAINT [FK__MachinePa__Batch__116A8EFB]
GO

ALTER TABLE [dbo].[MachineParameterDataHeaders]  WITH CHECK ADD  CONSTRAINT [FK__MachinePa__Plant__0F824689] FOREIGN KEY([PlantID])
REFERENCES [dbo].[Plants] ([PlantID])
GO

ALTER TABLE [dbo].[MachineParameterDataHeaders] CHECK CONSTRAINT [FK__MachinePa__Plant__0F824689]
GO

ALTER TABLE [dbo].[MachineParameterDataHeaders]  WITH CHECK ADD  CONSTRAINT [FK__MachineParameterDataHeaders_MachineParameterSets] FOREIGN KEY([MachineParameterSetID])
REFERENCES [dbo].[MachineParameterSets] ([MachineParameterSetID])
GO

ALTER TABLE [dbo].[MachineParameterDataHeaders] CHECK CONSTRAINT [FK__MachineParameterDataHeaders_MachineParameterSets]
GO

物品表:


/****** Object:  Table [dbo].[MachineParameterDataItems]    Script Date: 01.04.2019 11:24:09 ******/
SET ANSI_NULLS ON
GO

SET QUOTED_IDENTIFIER ON
GO

CREATE TABLE [dbo].[MachineParameterDataItems](
   [MachineParameterDataItemID] [int] IDENTITY(1,1) NOT NULL,
   [PlantID] [smallint] NOT NULL,
   [MachineParameterDataHeaderID] [int] NOT NULL,
   [Value] [decimal](18, 6) NULL,
   [MachineParameterSetConfigID] [int] NOT NULL,
PRIMARY KEY CLUSTERED 
(
   [MachineParameterDataItemID] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]
GO

ALTER TABLE [dbo].[MachineParameterDataItems]  WITH CHECK ADD  CONSTRAINT [FK__MachinePa__Machi__19FFD4FC] FOREIGN KEY([MachineParameterDataHeaderID])
REFERENCES [dbo].[MachineParameterDataHeaders] ([MachineParameterDataHeaderID])
GO

ALTER TABLE [dbo].[MachineParameterDataItems] CHECK CONSTRAINT [FK__MachinePa__Machi__19FFD4FC]
GO

ALTER TABLE [dbo].[MachineParameterDataItems]  WITH CHECK ADD  CONSTRAINT [FK__MachinePa__Plant__190BB0C3] FOREIGN KEY([PlantID])
REFERENCES [dbo].[Plants] ([PlantID])
GO

ALTER TABLE [dbo].[MachineParameterDataItems] CHECK CONSTRAINT [FK__MachinePa__Plant__190BB0C3]
GO

ALTER TABLE [dbo].[MachineParameterDataItems]  WITH CHECK ADD  CONSTRAINT [FK_MachineParameterDataItems_MachineParameterSetConfigs] FOREIGN KEY([MachineParameterSetConfigID])
REFERENCES [dbo].[MachineParameterSetConfigs] ([MachineParameterSetConfigID])
GO

ALTER TABLE [dbo].[MachineParameterDataItems] CHECK CONSTRAINT [FK_MachineParameterDataItems_MachineParameterSetConfigs]
GO

這是相關的執行計劃

有誰知道問題可能是什麼?

標題行的 INSERT 不在 SQL 事務中,因此第一個項目行的 INSERT 被鎖定。我不知道一段時間後是否有某種自動送出,但是將標頭 INSERT 添加到 SQL 事務中解決了這個問題。

插入中使用的變數是如何生成的?這段程式碼是通過儲存過程執行的嗎?如果是這樣,那麼我會檢查參數嗅探,因為插入的範圍是 5-20 秒。

引用自:https://dba.stackexchange.com/questions/233648