Có cách nào hữu ích hơn để phát hiện các số liệu thống kê thu / phát hành khóa trong SQL Profiler không?


8

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], 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

Câu trả lời:


13

Đ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?

Khóa leo thang. Nếu 'select' của bạn không ... chọn lọc, nếu nó phải quét các phần lớn của bảng thì động cơ có thể leo thang đến khóa bảng. Xem Khóa nâng cấp (Cơ sở dữ liệu) .

Tôi có thể thấy có 2 Khóa thoát xảy ra, điều đó có nghĩa là khóa hàng đã được chuyển sang khóa bảng?

Có phải họ khóa các sự kiện leo thang, hoặc chỉ khóa các nỗ lực leo thang ? Nếu họ thành công thì giao dịch đã khóa toàn bộ bảng.

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?

Tiếp cận điều này từ các khóa riêng lẻ POV không hiệu quả lắm. Cuộc điều tra điển hình tập trung vào việc nắm bắt và phân tích biểu đồ bế tắc. Xem Phân tích các bế tắc với SQL Server Profiler . Nắm bắt biểu đồ bế tắc và đăng nó ở đây và có lẽ chúng ta có thể giúp đỡ. Tải lên đồ thị bế tắc XML , không phải hình ảnh của bế tắc, xem Cách: Lưu đồ thị bế tắc (SQL Server Profiler) .

Biểu đồ bế tắc:

Spid 58 có trang 7: 1: 11066 ở chế độ IX và đang chặn spid 61 muốn nó ở chế độ S. Spid 61 có trang 7: 1: 1932345 ở chế độ S và đang chặn spid 58, người có khóa chế độ IU nhưng muốn chuyển đổi nó thành IX. Mọi thứ trở nên phức tạp khi bổ sung tính song song và một danh sách dài những người phục vụ 'tôi cũng vậy', nhưng vấn đề cơ bản có thể được giảm xuống như tôi đã mô tả ở trên.

Đây là một mô hình điển hình của việc thiếu chỉ số. Bạn có một trình cập nhật, XWingNew.dbo.UpdatePostsCleanedUriUniqueUriđang phát hành một bản cập nhật có khả năng quét toàn bộ XWingNew.dbo.Postsbảng. Đồng thời, bạn cũng có một số độc giả có khả năng quét toàn bộ bảng trong một số truy vấn được tạo linq đã bị cắt cụt trong XML : SELECT [UnionAll3].[C2] AS [C1], [UnionAll3].[C3] AS [C2], [UnionAll3].[C4] AS [C3], [UnionAll3].[C5] AS [C4],.... Bởi vì cả bản cập nhật và bảng vấn đề được chọn đều quét, chúng được đảm bảo khá nhiều bế tắc khi bản cập nhật cố gắng chuyển đổi các khóa trang IU mà nó thu được trong giai đoạn quét thành các khóa IX cần thiết để cập nhật các hàng đủ điều kiện.

Bạn có hai lựa chọn để theo đuổi ngay bây giờ:

  • sửa ứng dụng của bạn Các truy vấn rõ ràng không được điều chỉnh và không có suy nghĩ nào được đưa ra cho các chiến lược lập chỉ mục. Bạn sẽ không chỉ khắc phục vấn đề bế tắc, mà ứng dụng của bạn cũng sẽ nhanh hơn nhiều.
  • cảnh sát dễ dàng: cho phép đọc ảnh chụp nhanh cam kết . Điều này sẽ không sửa các lỗi ứng dụng, nhưng sẽ ẩn chúng và loại bỏ các bế tắc.
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.