Có một vài bế tắc xảy ra trên máy chủ trực tiếp của chúng tôi, tôi biết, nó rất đúng.
Dù sao, tôi đang cố gắng tìm ra cách xem mã SQL nào đang gây ra các khóa (hoặc giữ nó quá lâu).
Tôi đã thêm tất cả các sự kiện Khóa (thu được, bế tắc, leo thang, phát hành, hết thời gian, v.v.), nhưng tất cả những gì tôi thấy là một sự bắn phá của các sự kiện được mua / phát hành, không có nhiều thông tin bổ sung đi kèm.
Tôi khá chắc chắn rằng tôi biết "kịch bản" gây ra bế tắc, vì chúng ta có một trình kích hoạt trên bàn sau khi XÁC NHẬN / CẬP NHẬT / XÓA, và điều này làm RẤT NHIỀU công việc phụ, đôi khi có giá trị lên tới 8 giây.
Tuy nhiên, trong phần lớn công việc bổ sung đó, dữ liệu được lấy từ TableA và chèn vào biến bảng, hàng đống công việc xuất hiện trong bộ nhớ trên biến bảng đó (khoảng 6 giây trôi qua), sau đó cuối cùng xảy ra việc chèn vào TableB.
Câu hỏi: Điều đó có thực sự gây ra khóa bảng trên toàn bộ bảng không, mặc dù tôi chỉ chọn một số hàng nhất định vào một biến bảng?
Tôi đã thêm "theo dõi kích hoạt" (chèn vào giá trị bảng x ('hi im đây'), v.v.) và về cơ bản tôi biết quy trình mất nhiều thời gian nhất (và do đó có khả năng gây ra khóa?)
Nhưng tôi vẫn không chắc tại sao sự bế tắc đang xảy ra.
Câu hỏi: Tôi có thể thấy có 2 Khóa thoát hiểm xảy ra, điều đó có nghĩa là khóa hàng đã được chuyển sang khóa bảng?
Câu hỏi: Ai đó có thể cho tôi một số lời khuyên về cách theo dõi sự bế tắc này hơn nữa không?
BIÊN TẬP:
Dưới đây là biểu đồ bế tắc
EDIT 2:
Đây là mã cho [UpdatePostsCleanedUriUniqueUri], có thể gây ra khóa bảng?
ALTER PROC [dbo].[UpdatePostsCleanedUriUniqueUri]
(
@PostIds IdentityType READONLY
)
AS
SET NOCOUNT ON
-- *************************************************************************
-- ******************* Create the Cleaned Uri's, first ********************
-- *************************************************************************
---- "Remove" any existing cleaned uri's, per location
UPDATE a
SET a.CleanedUri = NEWID(),
a.UniqueUri = NEWID()
FROM [dbo].[Posts] a
INNER JOIN @PostIds b ON a.PostId = b.Id
-- ** Now add the cleaned uri.
UPDATE a
SET a.CleanedUri = [dbo].[ToFixedLengthToString](
[dbo].[IsNullOrEmpty](LOWER([dbo].[ToAlphaNumericText]([Subject], '-', 1)), 'unknown'), 60, '')
FROM [dbo].[Posts] a
INNER JOIN @PostIds b ON a.PostId = b.Id
-- *************************************************************************
-- ******** Now create the Unique Uri from the cleaned one, above **********
-- *************************************************************************
-- Now Re-Add these unique uri's.
;WITH CTE AS (
SELECT DISTINCT CleanedUri
FROM [dbo].[Posts] a
INNER JOIN @PostIds b ON a.PostId = b.Id
)
UPDATE a
SET a.UniqueUri = Result.UniqueUri
FROM [dbo].[Posts] a
INNER JOIN (
SELECT SubQuery.PostId,
CASE SubQuery.RowNumber
WHEN 1 THEN SubQuery.CleanedUri
ELSE SubQuery.CleanedUri + '-' + CAST(SubQuery.RowNumber - 1 AS NVARCHAR(20)) END AS UniqueUri
FROM (
SELECT PostId, a.CleanedUri,
ROW_NUMBER() OVER (PARTITION BY a.CleanedUri ORDER BY a.CleanedUri) AS RowNumber
FROM [dbo].[Posts] a
INNER JOIN CTE b ON a.CleanedUri = b.CleanedUri
) SubQuery
) Result ON a.PostId = Result.PostId
;
Bởi vì nó có THAM GIA VÀO, tôi có thể nghĩ rằng nó sẽ chỉ khóa các hàng được khớp? Hay tôi nên sử dụng WITH (ROWLOCK)?
EDIT 3:
USE [XWing]
GO
/****** Object: Table [dbo].[Posts] Script Date: 02/17/2012 13:29:05 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
SET ANSI_PADDING ON
GO
CREATE TABLE [dbo].[Posts](
[PostId] [int] IDENTITY(1,1) NOT NULL,
[Subject] [nvarchar](300) NULL,
[CleanedUri] [nvarchar](70) NOT NULL,
[UniqueUri] [nvarchar](70) NOT NULL,
[Content] [nvarchar](max) NULL,
[Source] [nvarchar](50) NULL,
[LocationTypeId] [tinyint] NOT NULL,
[CreatedOn] [smalldatetime] NOT NULL,
[ModifiedOn] [smalldatetime] NOT NULL,
[IsEditorsChoice] [bit] NOT NULL,
[IsVisible] [bit] NOT NULL,
[UserId] [int] NOT NULL,
[LatLongPoint] [geography] NULL,
[UserLastIpAddress] [varchar](15) NULL,
[OldPostId] [int] NULL,
[OldUniqueUri] [nvarchar](250) NULL,
[ThemeId] [int] NOT NULL,
CONSTRAINT [PK_Posts] PRIMARY KEY CLUSTERED
(
[PostId] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON, FILLFACTOR = 90) ON [PRIMARY]
) ON [PRIMARY]
GO
SET ANSI_PADDING OFF
GO
ALTER TABLE [dbo].[Posts] WITH CHECK ADD CONSTRAINT [FK_Posts_Themes] FOREIGN KEY([ThemeId])
REFERENCES [dbo].[Themes] ([ThemeId])
GO
ALTER TABLE [dbo].[Posts] CHECK CONSTRAINT [FK_Posts_Themes]
GO
ALTER TABLE [dbo].[Posts] WITH CHECK ADD CONSTRAINT [FK_Posts_Users] FOREIGN KEY([UserId])
REFERENCES [dbo].[Users] ([UserId])
GO
ALTER TABLE [dbo].[Posts] CHECK CONSTRAINT [FK_Posts_Users]
GO
ALTER TABLE [dbo].[Posts] ADD CONSTRAINT [DF_Posts_IsEditorsChoice] DEFAULT ((0)) FOR [IsEditorsChoice]
GO
ALTER TABLE [dbo].[Posts] ADD CONSTRAINT [DF_Posts_ThemeId] DEFAULT ((1)) FOR [ThemeId]
GO
USE [XWing]
GO
/****** Object: Index [IX_Posts_IsEditorsChoice_Include_PostId_LocationTypeId] Script Date: 02/17/2012 13:31:59 ******/
CREATE NONCLUSTERED INDEX [IX_Posts_IsEditorsChoice_Include_PostId_LocationTypeId] ON [dbo].[Posts]
(
[IsEditorsChoice] ASC
)
INCLUDE ( [PostId],
[LocationTypeId]) WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, SORT_IN_TEMPDB = OFF, IGNORE_DUP_KEY = OFF, DROP_EXISTING = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON, FILLFACTOR = 90) ON [PRIMARY]
GO
USE [XWing]
GO
/****** Object: Index [IX_Posts_IsVisible] Script Date: 02/17/2012 13:32:02 ******/
CREATE NONCLUSTERED INDEX [IX_Posts_IsVisible] ON [dbo].[Posts]
(
[IsVisible] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, SORT_IN_TEMPDB = OFF, IGNORE_DUP_KEY = OFF, DROP_EXISTING = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON, FILLFACTOR = 90) ON [PRIMARY]
GO
USE [XWing]
GO
/****** Object: Index [IX_Posts_LocationTypeId] Script Date: 02/17/2012 13:32:07 ******/
CREATE NONCLUSTERED INDEX [IX_Posts_LocationTypeId] ON [dbo].[Posts]
(
[LocationTypeId] ASC
)
INCLUDE ( [PostId]) WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, SORT_IN_TEMPDB = OFF, IGNORE_DUP_KEY = OFF, DROP_EXISTING = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON, FILLFACTOR = 90) ON [PRIMARY]
GO
USE [XWing]
GO
/****** Object: Index [IX_Posts_OldPostId] Script Date: 02/17/2012 13:32:12 ******/
CREATE NONCLUSTERED INDEX [IX_Posts_OldPostId] ON [dbo].[Posts]
(
[OldPostId] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, SORT_IN_TEMPDB = OFF, IGNORE_DUP_KEY = OFF, DROP_EXISTING = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON, FILLFACTOR = 90) ON [PRIMARY]
GO
USE [XWing]
GO
/****** Object: Index [IX_Posts_UserId] Script Date: 02/17/2012 13:32:17 ******/
CREATE NONCLUSTERED INDEX [IX_Posts_UserId] ON [dbo].[Posts]
(
[UserId] ASC
)
INCLUDE ( [PostId]) WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, SORT_IN_TEMPDB = OFF, IGNORE_DUP_KEY = OFF, DROP_EXISTING = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON, FILLFACTOR = 90) ON [PRIMARY]
GO
USE [XWing]
GO
/****** Object: Index [SX_Posts_Location] Script Date: 02/17/2012 13:32:22 ******/
CREATE SPATIAL INDEX [SX_Posts_Location] ON [dbo].[Posts]
(
[LatLongPoint]
)USING GEOGRAPHY_GRID
WITH (
GRIDS =(LEVEL_1 = LOW,LEVEL_2 = LOW,LEVEL_3 = MEDIUM,LEVEL_4 = HIGH),
CELLS_PER_OBJECT = 16, PAD_INDEX = OFF, SORT_IN_TEMPDB = OFF, DROP_EXISTING = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
GO
USE [XWing]
GO
/****** Object: Index [UIX_Posts_UniqueUri] Script Date: 02/17/2012 13:32:41 ******/
CREATE UNIQUE NONCLUSTERED INDEX [UIX_Posts_UniqueUri] ON [dbo].[Posts]
(
[UniqueUri] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, SORT_IN_TEMPDB = OFF, IGNORE_DUP_KEY = OFF, DROP_EXISTING = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON, FILLFACTOR = 80) ON [PRIMARY]
GO
CHỈNH SỬA 4
Dưới đây là kế hoạch thực hiện cho UpdatePostsCleanedUriUniqueUri sau khi thêm chỉ mục sau cho CleanedUri:
CREATE NONCLUSTERED INDEX [IX_Posts_CleanedUri_Include_PostId] ON [dbo].[Posts]
(
[CleanedUri] ASC
)
INCLUDE ( [PostId]) WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, SORT_IN_TEMPDB = OFF, IGNORE_DUP_KEY = OFF, DROP_EXISTING = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
GO