Cập nhật Intersect treo


7

Chúng tôi có hành vi thực sự kỳ lạ này, chúng tôi mới bắt đầu trải nghiệm với các tuyên bố giao nhau cập nhật của mình. Chúng hoạt động tốt, nhưng bây giờ chúng tôi đang sử dụng một nguồn dữ liệu khá rộng về các cột và chậm dần cho đến khi bị treo vô thời hạn.

Truy vấn bên dưới sẽ ngày càng dài hơn khi chúng ta thêm dữ liệu theo các nhóm như 20K hàng (rất nhỏ) và treo khoảng 70K hàng. Không có chỉ mục nào được sử dụng, chúng tôi bỏ chúng trước khi chúng tôi nhập dữ liệu.

Đây là tuyên bố:

UPDATE Staging.[TdDailyPerformance]
SET [SYS_OPERATION] = 'U'
FROM (
    SELECT [HashCode]           
    FROM Staging.[TdDailyPerformance]
    INTERSECT
    SELECT [HashCode]
    FROM [IdMatch].[TdDailyPerformance]
) AS A

Kế hoạch thực hiện:

ExecutPlan_1

nhập mô tả hình ảnh ở đây

Bây giờ truy vấn này hoạt động ở nhiều nơi khác trên máy chủ của chúng tôi nhưng không phải ở đây. Điều thú vị là cho dù các INTERSECThàng trả về, truy vấn vẫn bị treo vĩnh viễn (tôi kiểm tra điều này bằng cách chạy giao cắt độc lập - chỉ mất chưa đến 2ms.).

Có vẻ như theo SQL, nó không hoạt động, nhưng nó không hoạt động. Nếu HasCodetrong Stagingbảng đã tồn tại trong IdMatchbảng nó cập nhật [SYS_OPERATION]của Stagingbảng để có chữ "U". Chúng tôi sử dụng một vài nơi và nó chỉ bắt đầu thất bại trên bộ dữ liệu này gần đây.

Bất cứ ý tưởng những gì có thể gây ra điều này?

Không chặn, theo như chúng ta có thể thấy. Các loại chờ duy nhất trên giao dịch CXPACKETlà những gì tôi mong đợi từ QP. Tôi đã truy vấn sp_who2, xem Tất cả các Giao dịch và Giám sát hoạt động để xác định các khối và không tìm thấy gì. Tôi đã không truy tìm.

Hầu hết, các thử nghiệm của chúng tôi đều hoạt động ngay bây giờ, để nó có 0 hàng khi treo. Nhưng chúng tôi đã xác minh rằng nó cũng bị treo với 1-100 hàng đó INTERSECT.

IdMatchkhông HashCodestồn tại trong đó Staging, nhưng cả hai bảng có khoảng 70K hàng tại thời điểm treo. Vì vậy, để rõ ràng, cả hai bảng có khoảng 70K, nhưng giao điểm trên HashCodelà 0 hàng.

Chúng tôi đã thử nghiệm với các chỉ số. Chúng tôi nhận được hiệu suất tổng thể kém trước khi chúng tôi truy vấn trong câu hỏi. Các chỉ số chỉ là những mảnh quá nhanh để có ích.

Bảng định nghĩa

Staging.TdD DailyPerformance

CREATE TABLE [Staging].[TdDailyPerformance]
(
    [ID] INT NOT NULL,
    [SYS_OPERATION] CHAR(8) NULL,
    [HashCode] BINARY(65) NULL,
    [Ad Environment] NVARCHAR(1024) NULL,
    [Ad Format] NVARCHAR(10) NULL,
    [Ad Group] NVARCHAR(1024) NULL,
    [Ad Group ID] NVARCHAR(32) NULL,
    [Ad Server Creative Placement ID] NVARCHAR(1024) NULL,
    [Ad Server Name] NVARCHAR(1024) NULL,
    [Advertiser] NVARCHAR(1024) NULL,
    [Advertiser Currency Code] NVARCHAR(32) NULL,
    [Advertiser ID] NVARCHAR(32) NULL,
    [App] NVARCHAR(1024) NULL,
    [Audience] NVARCHAR(1024) NULL,
    [Audience ID] NVARCHAR(32) NULL,
    [Browser] NVARCHAR(30) NULL,
    [Campaign] NVARCHAR(1024) NULL,
    [Campaign ID] NVARCHAR(32) NULL,
    [Carrier ID] INT NULL,
    [Carrier Name] NVARCHAR(1024) NULL,
    [Category ID] NVARCHAR(1024) NULL,
    [Category Name] NVARCHAR(1024) NULL,
    [City] NVARCHAR(50) NULL,
    [Country] NVARCHAR(50) NULL,
    [Creative] NVARCHAR(1024) NULL,
    [Creative Duration In Seconds] INT NULL,
    [Creative ID] NVARCHAR(32) NULL,
    [Date] NVARCHAR(1024) NULL,
    [Deal ID] NVARCHAR(128) NULL,
    [Device Make] NVARCHAR(32) NULL,
    [Device Type] NVARCHAR(15) NULL,
    [Fold] NVARCHAR(128) NULL,
    [Language] NVARCHAR(1024) NULL,
    [Market Type] NVARCHAR(32) NULL,
    [Media Type] NVARCHAR(32) NULL,
    [Metro] NVARCHAR(128) NULL,
    [Metro Code] INT NULL,
    [Operating System] NVARCHAR(32) NULL,
    [Operating System Family] NVARCHAR(1024) NULL,
    [Partner ID] NVARCHAR(32) NULL,
    [Partner Name] NVARCHAR(32) NULL,
    [Recency Group] NVARCHAR(32) NULL,
    [Recency Group End In Minutes] INT NULL,
    [Recency Group Start In Minutes] INT NULL,
    [Region] NVARCHAR(128) NULL,
    [Site] NVARCHAR(128) NULL,
    [Site List Name] NVARCHAR(1024) NULL,
    [Site/Category Bid Factor] NVARCHAR(1024) NULL,
    [Supply Vendor] NVARCHAR(25) NULL,
    [Supply Vendor Publisher Id] NVARCHAR(64) NULL,
    [Timezone] NVARCHAR(1024) NULL,
    [Video Playback Type] NVARCHAR(32) NULL,
    [Whitelist Site] NVARCHAR(32) NULL,
    [Partner Currency Code] NVARCHAR(1024) NULL,
    [Additional Fee Cost (Adv Currency)] DECIMAL(37,15) NULL,
    [Additional Fee Cost (Partner Currency)] DECIMAL(37,15) NULL,
    [Additional Fee Cost (USD)] DECIMAL(37,15) NULL,
    [Advertiser Cost (Adv Currency)] DECIMAL(37,15) NULL,
    [Advertiser Cost (Partner Currency)] DECIMAL(37,15) NULL,
    [Advertiser Cost (USD)] DECIMAL(37,15) NULL,
    [All Last Click + View Conversions] INT NULL,
    [Bids] INT NULL,
    [Clicks] INT NULL,
    [Companion Clicks] INT NULL,
    [Companion Impressions] INT NULL,
    [Data Cost (Adv Currency)] DECIMAL(37,15) NULL,
    [Data Cost (Partner Currency)] DECIMAL(37,15) NULL,
    [Data Cost (USD)] DECIMAL(37,15) NULL,
    [Fee Features Cost (Adv Currency)] DECIMAL(37,15) NULL,
    [Fee Features Cost (Partner Currency)] DECIMAL(37,15) NULL,
    [Fee Features Cost (USD)] DECIMAL(37,15) NULL,
    [IAS Display Fully In View 0 Seconds] INT NULL,
    [IAS Display Fully In View 1 Second] INT NULL,
    [IAS Display Fully In View 15 Seconds] INT NULL,
    [IAS Display Fully In View 5 Seconds] INT NULL,
    [IAS Display In View 1 Second] INT NULL,
    [IAS Display In View 15 Seconds] INT NULL,
    [IAS Display In View 5 Seconds] INT NULL,
    [IAS High Risk Impression Count] INT NULL,
    [IAS Low Risk Impression Count] INT NULL,
    [IAS Moderate Risk Impression Count] INT NULL,
    [IAS Non GVIT Impression Count] INT NULL,
    [IAS Suspicious Activity] INT NULL,
    [IAS Total Impression Count] INT NULL,
    [IAS Very High Risk Impression Count] INT NULL,
    [IAS Video 25% Complete] INT NULL,
    [IAS Video 50% Complete] INT NULL,
    [IAS Video 75% Complete] INT NULL,
    [IAS Video Completed Views] INT NULL,
    [IAS Video Muted] INT NULL,
    [IAS Video Viewable 25% Complete] INT NULL,
    [IAS Video Viewable 50% Complete] INT NULL,
    [IAS Video Viewable 75% Complete] INT NULL,
    [IAS Video Viewable Completed Views] INT NULL,
    [Impressions] INT NULL,
    [In-banner Player Impressions] INT NULL,
    [Large Player Impressions] INT NULL,
    [Media Cost (Adv Currency)] DECIMAL(37,15) NULL,
    [Media Cost (Partner Currency)] DECIMAL(37,15) NULL,
    [Media Cost (USD)] DECIMAL(37,15) NULL,
    [Medium Player Impressions] INT NULL,
    [MOAT Display In View Time 10 Seconds] INT NULL,
    [MOAT Display In View Time 15 Seconds] INT NULL,
    [MOAT Display In View Time 30 Seconds] INT NULL,
    [MOAT Display In View Time 5 Seconds] INT NULL,
    [MOAT Display On Screen] INT NULL,
    [MOAT Display Universal Interaction] INT NULL,
    [MOAT Display Universal Interaction Time 10 Seconds] INT NULL,
    [MOAT Display Universal Interaction Time 15 Seconds] INT NULL,
    [MOAT Display Universal Interaction Time 30 Seconds] INT NULL,
    [MOAT Display Universal Interaction Time 5 Seconds] INT NULL,
    [MOAT Video Audible and Visible on Complete] INT NULL,
    [MOAT Video In View Time 3 Seconds] INT NULL,
    [MOAT Video In View Time 5 Seconds] INT NULL,
    [MOAT Video Visible on Complete] INT NULL,
    [Non-USD Currency Cost (Adv Currency)] DECIMAL(37,15) NULL,
    [Non-USD Currency Cost (Partner Currency)] DECIMAL(37,15) NULL,
    [Non-USD Currency Cost (USD)] DECIMAL(37,15) NULL,
    [Partner Cost (Adv Currency)] DECIMAL(37,15) NULL,
    [Partner Cost (Partner Currency)] DECIMAL(37,15) NULL,
    [Partner Cost (USD)] DECIMAL(37,15) NULL,
    [Player 25% Complete] INT NULL,
    [Player 50% Complete] INT NULL,
    [Player 75% Complete] INT NULL,
    [Player Audible Event] INT NULL,
    [Player Close] INT NULL,
    [Player Collapse] INT NULL,
    [Player Completed Views] INT NULL,
    [Player Engaged Views] INT NULL,
    [Player Errors] INT NULL,
    [Player Expansion] INT NULL,
    [Player Full Screen] INT NULL,
    [Player Invitation Accept] INT NULL,
    [Player Mute] INT NULL,
    [Player Pause] INT NULL,
    [Player Playing Event] INT NULL,
    [Player Resume] INT NULL,
    [Player Rewind] INT NULL,
    [Player Skip] INT NULL,
    [Player Starts] INT NULL,
    [Player Total Playing Seconds] INT NULL,
    [Player Unmute] INT NULL,
    [Player Views] INT NULL,
    [Predictive Clearing Savings (Adv Currency)] DECIMAL(37,15) NULL,
    [Predictive Clearing Savings (Partner Currency)] DECIMAL(37,15) NULL,
    [Predictive Clearing Savings (USD)] DECIMAL(37,15) NULL,
    [Profit (Adv Currency)] DECIMAL(37,15) NULL,
    [Profit (Partner Currency)] DECIMAL(37,15) NULL,
    [Profit (USD)] DECIMAL(37,15) NULL,
    [Sampled Tracked Impressions] INT NULL,
    [Sampled Viewed Impressions] INT NULL,
    [Small Player Impressions] INT NULL,
    [Total Audible Seconds] INT NULL,
    [Total Bid Amount (Adv Currency)] DECIMAL(37,15) NULL,
    [Total Bid Amount (Partner Currency)] DECIMAL(37,15) NULL,
    [Total Bid Amount (USD)] DECIMAL(37,15) NULL,
    [Total Custom CPA Conversions] INT NULL,
    [Total Seconds In View] INT NULL,
    [TTD Cost (Adv Currency)] DECIMAL(37,15) NULL,
    [TTD Cost (Partner Currency)] DECIMAL(37,15) NULL,
    [TTD Cost (USD)] DECIMAL(37,15) NULL,
    [TTD Margin (Adv Currency)] DECIMAL(37,15) NULL,
    [TTD Margin (Partner Currency)] DECIMAL(37,15) NULL,
    [TTD Margin (USD)] DECIMAL(37,15) NULL,
    [Video In View Event] INT NULL,
    [White Ops SIVT Bids Avoided] INT NULL,

    [CreatedOn] DATETIME2 NULL CONSTRAINT df_Staging_TdDailyPerformance_CreatedOn DEFAULT SYSUTCDATETIME(),
    [ModifiedOn] DATETIME2 NULL CONSTRAINT df_Staging_TdDailyPerformance_ModifiedOn DEFAULT SYSUTCDATETIME(),
    [Retired] BIT NULL CONSTRAINT df_Staging_TdDailyPerformance_Retired DEFAULT 0
)

IdMatch.TdD DailyPerformance

CREATE TABLE [IdMatch].[TdDailyPerformance]
(
    [ID] INT IDENTITY(1,1) NOT NULL,
    [HashCode] BINARY(65) NOT NULL,
    [Ad Environment] NVARCHAR(1024) NULL,
    [Ad Format] NVARCHAR(10) NULL,
    [Ad Group] NVARCHAR(1024) NULL,
    [Ad Group ID] NVARCHAR(32) NULL,
    [Ad Group Integer ID] INT NULL,
    [Ad Server Creative Placement ID] NVARCHAR(1024) NULL,
    [Ad Server Name] NVARCHAR(1024) NULL,
    [Advertiser] NVARCHAR(1024) NULL,
    [Advertiser Currency Code] NVARCHAR(1024) NULL,
    [Advertiser ID] NVARCHAR(32) NULL,
    [App] NVARCHAR(1024) NULL,
    [Browser] NVARCHAR(30) NULL,
    [Campaign] NVARCHAR(1024) NULL,
    [Campaign ID] NVARCHAR(32) NULL,
    [Carrier ID] INT NULL,
    [Carrier Name] NVARCHAR(1024) NULL,
    [Category ID] NVARCHAR(1024) NULL,
    [Category Name] NVARCHAR(1024) NULL,
    [City] NVARCHAR(50) NULL,
    [Country] NVARCHAR(50) NULL,
    [Creative] NVARCHAR(1024) NULL,
    [Creative Duration In Seconds] INT NULL,
    [Creative ID] NVARCHAR(32) NULL,
    [Date] NVARCHAR(1024) NULL,
    [Device Make] NVARCHAR(32) NULL,
    [Device Type] NVARCHAR(15) NULL,
    [Fold] NVARCHAR(128) NULL,
    [Language] NVARCHAR(1024) NULL,
    [Market Type] NVARCHAR(32) NULL,
    [Media Type] NVARCHAR(32) NULL,
    [Metro] NVARCHAR(128) NULL,
    [Metro Code] INT NULL,
    [Operating System] NVARCHAR(32) NULL,
    [Operating System Family] NVARCHAR(1024) NULL,
    [Partner ID] NVARCHAR(32) NULL,
    [Partner Name] NVARCHAR(32) NULL,
    [Region] NVARCHAR(128) NULL,
    [Site] NVARCHAR(128) NULL,
    [Site List Name] NVARCHAR(1024) NULL,
    [Site/Category Bid Factor] NVARCHAR(1024) NULL,
    [Supply Vendor] NVARCHAR(25) NULL,
    [Supply Vendor Integer ID] INT NULL,
    [Supply Vendor Publisher Id] NVARCHAR(64) NULL,
    [Timezone] NVARCHAR(1024) NULL,
    [Video Playback Type] NVARCHAR(32) NULL,
    [Whitelist Site] NVARCHAR(32) NULL,
    [CreatedOn] DATETIME2 NOT NULL CONSTRAINT df_IdMatch_TdDailyPerformance_CreatedOn DEFAULT SYSUTCDATETIME(),
    [ModifiedOn] DATETIME2 NOT NULL CONSTRAINT df_IdMatch_TdDailyPerformance_ModifiedOn DEFAULT SYSUTCDATETIME(),
    [Retired] BIT NOT NULL CONSTRAINT df_IdMatch_TdDailyPerformance_Retired DEFAULT 0
)
GO

Câu trả lời:


11

Bạn đã viết một sự tham gia chéo tình cờ:

UPDATE Staging.[TdDailyPerformance]
SET [SYS_OPERATION] = 'U'
FROM (
    SELECT [HashCode]           
    FROM Staging.[TdDailyPerformance]
    INTERSECT
    SELECT [HashCode]
    FROM [IdMatch].[TdDailyPerformance]
) AS A

Đó là một lỗi khá phổ biến khi sử dụng FROMphần mở rộng của T-SQL UPDATE.

Kỳ vọng là cả hai tham chiếu để Staging.[TdDailyPerformance]xác định cùng một thể hiện của đối tượng, nhưng đó không phải là cách nó hoạt động.

Câu lệnh trên thực sự xác định rằng tất cả các hàng của mục tiêu cần được cập nhật nếu bảng dẫn Axuất tạo ra bất kỳ hàng nào . Hai trường hợp Staging.[TdDailyPerformance]được ràng buộc riêng.

Truy vấn dường như bị treo vì những lý do tôi thảo luận riêng ở cuối câu trả lời này.

Cách an toàn nhất để viết loại cập nhật này là bí danh các bảng và luôn sử dụng bí danh làm mục tiêu. (Bạn cũng nên viết truy vấn một cách xác định sao cho mỗi hàng đích chỉ có thể được cập nhật tối đa một lần.)

Nếu chúng ta cố gắng tuân theo quy tắc bí danh với tuyên bố trên:

UPDATE S_TDP
SET SYS_OPERATION = 'U'
FROM
(
    SELECT S_TDP.HashCode
    FROM Staging.TdDailyPerformance AS S_TDP
    INTERSECT
    SELECT I_TDP.HashCode
    FROM IdMatch.TdDailyPerformance AS I_TDP
) AS A;

Chúng tôi nhận được một lỗi ràng buộc, thông báo cho chúng tôi về lỗi:

Msg 208, Cấp 16, Trạng thái 1, Dòng xxx
Tên đối tượng không hợp lệ 'S_TDP'.

Bạn đã biết về các lựa chọn thay thế đang hoạt động, vì vậy tôi sẽ không chuyển sang điểm đó, ngoại trừ việc đề cập rằng bạn có thể nên xem xét kết hợp hai bản cập nhật như được đề xuất trong phòng trò chuyện.

Hỏi đáp liên quan:

Phân tích kế hoạch

Tôi không biết bạn quan tâm đến kế hoạch thực hiện như thế nào đối với tuyên bố cập nhật không chính xác, nhưng chỉ trong trường hợp, đây là một phân tích ngắn gọn về phiên bản nối tiếp của kế hoạch.

Phần của kế hoạch bên dưới Top có liên quan đến việc tìm hàng đầu tiên (nếu có) do INTERSECT:

Subtree hàng đầu

Các dòng chảy riêng biệt là một tối ưu hóa hàng-mục tiêu đó nhằm mục đích để sản xuất giá trị mã băm khác biệt đầu tiên một cách nhanh chóng. Các Nested Loops Tham gia được chọn vì tôi ưu hoa chỉ hy vọng quét các bảng bên đống bên trong một lần để tìm mã khớp băm.

Chiến lược này được đưa ra khi không có kết quả khớp với mã băm. Trong trường hợp đó, phía bên trong sẽ được quét toàn bộ cho mỗi hàng ở phía bên ngoài - tổng cộng 70.000 lần quét. Có lẽ sẽ mất một lúc. Bạn có thể kiểm tra hiệu quả của việc xóa mục tiêu hàng bằng cách sử dụng cờ theo dõi tài liệu 4138, ví dụ thông qua gợi ý truy vấn OPTION (QUERYTRACEON 4138). Tuyên bố cập nhật sẽ vẫn không chính xác, nhưng ít nhất nó sẽ không xuất hiện để treo.

Bạn không thấy vấn đề này khi tự chạy INTERSECTvì mục tiêu hàng được giới thiệu (với Top) bởi trình tối ưu hóa khi nó tìm kiếm một kế hoạch hợp lý. Bạn có thể mô phỏng nó bằng một truy vấn như:

SELECT TOP (1) 1
FROM 
(
    SELECT S_TDP.HashCode
    FROM Staging.TdDailyPerformance AS S_TDP
    INTERSECT
    SELECT I_TDP.HashCode
    FROM IdMatch.TdDailyPerformance AS I_TDP
) AS A

Hoặc là:

SELECT DISTINCT 
    TDP.HashCode
FROM Staging.TdDailyPerformance AS TDP
CROSS JOIN 
(
    SELECT [HashCode]           
    FROM Staging.[TdDailyPerformance]
    INTERSECT
    SELECT [HashCode]
    FROM [IdMatch].[TdDailyPerformance]
) AS A;

Phần còn lại của kế hoạch cập nhật toàn bộ bảng mục tiêu nếu tìm thấy một hàng:

Cập nhật

Các Nested Loops Tham gia đã không tham gia vị. Các bản ghi nhóm Sắp xếpLuồng tổng hợp theo RID heap. Điều này là vô nghĩa nhưng nó là một phần của logic chung được sử dụng để thu gọn các kế hoạch có thể cập nhật cùng một hàng mục tiêu nhiều lần thành một cập nhật duy nhất (không xác định) trên mỗi hàng.

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.