我对 sql 非常陌生,特别是 azure sql。我创建了一个触发器,该触发器应该使用表中更新的外键来更新表(
clients_kv
)。为了避免更新 regions_kv
中的所有值,我对 regions_kv
和 inserted
进行了一些额外的连接。存储过程 regions_kv
只是选择 CleanupOldRecords
中每个标识符的最新值。我的问题是,当插入最多 6200 行时,触发器工作正常(大约 20 秒),但当达到 6300 行时,它只会挂起(至少 10 分钟)。更新部分在触发器之外工作正常。如果我删除更新部分中的 CASE WHEN 部分,它也可以工作。如果我删除 regions_kv
上的额外连接,它也可以工作。我已将 Azure 中的 DTU 加倍,没有任何差异。
它认为这可能与查询计划有关,但感觉就像是一个兔子洞。最重要的是了解为什么会发生这种情况以及如何确保它不会再次发生。非常感谢任何帮助或指出正确的方向!inserted
CREATE TRIGGER trg_instead_of_insert_regions_kv
ON dbo.regions_kv
-- instead of insert lets the user define how data is inserted
INSTEAD OF INSERT
AS
BEGIN
SET NOCOUNT ON;
-- Create a temporary table to hold distinct newValue_id values
CREATE TABLE #AffectedValueIds
(
newValue_id INT
);
-- Insert distinct newValue_id values from the `inserted` rows into the temporary table
INSERT INTO #AffectedValueIds
(newValue_id)
SELECT DISTINCT newValue_id
FROM inserted;
-- Insert the new rows into the target table
INSERT INTO dbo.regions_kv
SELECT *
FROM inserted;
-- Call the stored procedure to perform cleanup, referencing #AffectedValueIds
EXEC dbo.CleanupOldRecords @SchemaName = 'dbo', @TableName = 'regions_kv';
-- Insert the new rows into the target table and create a new forreign key
UPDATE cl
SET fk_regional_council_id =
CASE
WHEN r1.newValue_type = 'REGION_TYPE_REGIONAL_COUNCIL' THEN r1.newValue_id
WHEN r2.newValue_type = 'REGION_TYPE_REGIONAL_COUNCIL' THEN r2.newValue_id
WHEN r3.newValue_type = 'REGION_TYPE_REGIONAL_COUNCIL' THEN r3.newValue_id
ELSE NULL
END,
fk_region_id = COALESCE(r1.newValue_id, r2.newValue_id, r3.newValue_id)
FROM dbo.clients_kv as cl
INNER JOIN inserted as i
ON cl.newValue_operationalRegionIds = i.newValue_id
-- we only want the cleaned observations from inserted
INNER JOIN regions_kv r0 ON r0.header_eventId = i.header_eventId
INNER JOIN regions_kv r1 ON r1.newValue_id = cl.newValue_operationalRegionIds
LEFT JOIN regions_kv r2 ON r2.newValue_id = r1.newValue_parentRegionId
LEFT JOIN regions_kv r3 ON r3.newValue_id = r2.newValue_parentRegionId
SET NOCOUNT OFF;
END;
GO
请确保连接和 CASE 语句中使用的列已正确建立索引。您看过 Azure SQL 数据库查询性能洞察吗?查询是否被识别为 CPU 或 IO 瓶颈?