更新相交挂起

Jam*_*all 7 sql-server update sql-server-2014

我们有这种非常奇怪的行为,我们刚刚开始体验我们的 update intersect 语句。这些工作正常,但现在我们在列方面摄取了相当广泛的数据源,并逐渐减慢直至无限期挂起。

当我们以 20K 行(非常小)为一组添加数据时,下面的查询将变得越来越长,并且大约有 70K 行。没有使用索引,我们在摄取数据之前删除它们。

这是声明:

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

执行计划:

执行计划_1

在此处输入图片说明

现在这个查询在我们服务器上的许多其他地方都有效,但不是在这里。有趣的是,无论是否INTERSECT返回行,查询都会永远挂起(我通过独立运行 intersect 来测试这一点 - 它花费的时间不到 2ms。)。

根据 SQL 似乎它不应该工作,但确实如此。如果HasCodeStaging表中已经存在IdMatch的表就更新[SYS_OPERATION]了的Staging表是“U”。我们在几个地方使用了这几个地方,它最近才开始在这个数据集上失败。

任何想法可能导致这种情况?

就我们所见,没有阻塞。交易的唯一等待类型CXPACKET是我对 QP 的期望。我已经查询sp_who2、查看了所有事务和活动监视器以识别块,但一无所获。我没有追过。

大多数情况下,我们的测试现在可以运行,因此它在挂起时有 0 行。但是我们已经验证它也挂起 1-100 行INTERSECT.

IdMatch有没有HashCodes存在的Staging,但是这两个表在杭的时间大约有70K行。所以要清楚,两个表都有大约 70K,但交叉点HashCode是 0 行。

我们已经用索引进行了测试。在我们遇到有问题的查询之前,我们的整体性能很差。索引只是碎片化得太快而无济于事。

表定义

Staging.TdDailyPerformance

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
)
Run Code Online (Sandbox Code Playgroud)

IdMatch.TdDailyPerformance

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
Run Code Online (Sandbox Code Playgroud)

Pau*_*ite 11

你写了一个意外的交叉连接:

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

在使用T-SQL的扩展时,这是一个很常见的错误FROMUPDATE

期望是两个引用都Staging.[TdDailyPerformance]标识对象的同一实例,但这不是它的工作原理。

上面的语句实际上指定如果派生表产生任何行,则应更新目标的所有行。的两个实例分别绑定。AStaging.[TdDailyPerformance]

由于我在本答案末尾单独讨论的原因,查询似乎挂起。

编写此类更新的最安全方法是为表设置别名并始终使用别名作为目标。(您还应该确定性地编写查询,以便每个目标行最多只能更新一次。)

如果我们尝试使用上面的语句来遵循别名规则:

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;
Run Code Online (Sandbox Code Playgroud)

我们收到一个绑定错误,提醒我们注意错误:

消息 208,级别 16,状态 1,行 xxx
无效的对象名称“S_TDP”。

您已经知道可用的替代方案,因此我不会在这一点上进行讨论,只是提到您可能应该按照聊天室中的建议考虑将这两个更新结合起来。

相关问答:

计划分析

我不知道你对不正确的更新语句的执行计划有多感兴趣,但为了以防万一,这里是对计划的串行版本的简要分析。

顶部下方的计划部分与查找第一行(如果有)有关INTERSECT

顶部子树

流程鲜明的是行的目标优化,旨在迅速生产出第一不同哈希码值。的嵌套循环连接被选择,因为优化仅期望扫描内侧堆表一旦找到匹配的散列码。

当哈希码不匹配时,此策略就会暴露。在这种情况下,内侧将针对外侧的每一行进行全面扫描 - 总共 70,000 次全面扫描。这可能需要一段时间。您可以使用记录的跟踪标志 4138(例如通过查询提示)来测试删除行目标的效果。更新语句仍然不正确,但至少它不会挂起。OPTION (QUERYTRACEON 4138)

单独运行时您不会看到此问题,INTERSECT因为优化器在搜索合理计划时引入了行目标(与顶部)。您可以使用以下查询来模拟它:

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
Run Code Online (Sandbox Code Playgroud)

或者:

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

Run Code Online (Sandbox Code Playgroud)

如果找到一行,计划的其余部分将更新整个目标表:

更新

嵌套循环连接已经没有联接谓词。堆 RID的排序流聚合组记录。这是毫无意义的,但它是用于折叠计划的通用逻辑的一部分,这些计划可能将同一目标行多次更新为每行单个(非确定性)更新。