Sql-Server
交易中非常慢的簡單 INSERT
我在我的 SQL Server 上進行了有問題的查詢,但我找不到問題。我有兩個簡單的表,一個用於“標題”,一個用於“項目”(每個都有一個 PK 列,總共五個欄位和一些 FK)。
我的客戶端應用程序執行以下操作:
- 打開 SQL Server 事務
- 插入標題行(1-5 毫秒)
- 插入第一個項目行(標題行的PK值為FK - 5000-20000ms!)
- 插入第二個項目行(1-5 毫秒)
- 插入第 n 個項目行(1-5 毫秒)
- 犯罪
- 關閉交易
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 秒。