正如我在问题中所写,我的执行计划存在问题,正如您在标题中看到的那样,一组大约需要30-40秒才能完成的查询已将此部分纳入执行计划:< / p>
虽然该部分的执行计划在今天早上之前是这样的:
当所涉及的表格似乎没有发生实质性变化时,您是否知道可能导致这种情况的原因?
更多详细背景:在工作中,我们有来自不同供应商的不同.csv
,其中包含他们可以向我们出售的所有产品以及我们可能需要的所有数据。
由于我们经常只使用一小部分数据(ProductName
,BrandId
,Price
,Availability
),并且每个供应商的数据格式不同,我们将数据从.csv
推送到我们的SQL Server数据库,然后我们将这些子表(从5k到20k行)的数据合并到我们的主表(大约1500k行)。
简化查询与我们的所有程序非常类似:
我们有第一部分从子表中选择数据以获得我可以实际加载到我的数据库的公共结构。某些过滤器可能会在此阶段应用。
WITH query(Supplier, ProductCode, Brand, Price, RefreshDate, Quantity) AS
(
SELECT
'SUPPLIERANAME' AS Supplier,
supplierData.ProductCode AS ProductCode,
catalogo_mapping_produttori.nome AS Brand,
supplierData.Price AS Price,
GETDATE() AS RefreshDate,
supplierData.Quantity AS Quantity
FROM
SupplierA_Table AS supplierData
)
然后我只是将这些数据合并到我的主表:
MERGE Catalogo_Offerte AS T
USING query AS S
ON (T.ProductCode = S.ProductCode AND T.Brand = S.Brand AND T.Supplier = S.Supplier)
WHEN MATCHED
THEN UPDATE
SET
T.Price = S.Price,
T.RefreshDate = S.RefreshDate,
T.Quantity = S.Quantity
WHEN NOT MATCHED BY TARGET
THEN INSERT(Supplier, ProductCode, Brand, Price, RefreshDate, Quantity)
VALUES(S.Supplier, S.ProductCode, S.Brand, S.Price, S.RefreshDate, S.Quantity)
-- We allow some tolerance before deleting
WHEN NOT MATCHED BY SOURCE AND T.RefreshDate <= DATEADD(dd, -7, GETDATE())
THEN DELETE;
我可以根据需要编辑更多数据,并提前感谢所有花时间回答和讨论问题的人。
编辑#1 :查询计划,遗憾的是我们不得不第二次恢复数据库之后的计划,所以它不会出现问题: https://www.brentozar.com/pastetheplan/?id=SJqOL2lTz
关于索引:主表在(ProductCode,Brand,Supplier)上作为唯一索引工作,我们还有一个未出现在表中的身份密钥索引,这就是现在我发现假脱机的那个通知。
对于子表,它们具有不同的索引,一些设置为具有由供应商设置的自动增量键的类型,而其他具有我们的完美键(品牌,productCode)。大多数情况下我们得到这两种情况,显然在第一种情况下我们必须规范化数据以使其与我们的系统兼容。