我遇到了一个问题,我无法理解。我们正在运行SQL Server 2012.我遇到了一对基本相同的查询,这些查询产生不同的执行计划,并且执行的时间显着不同(1秒比40+秒)...并且他们甚至返回完全相同的记录。它们之间唯一的区别是记录被查询的类别。相同的查询,相同的数据库,不同的执行计划和执行的时间显着不同
该查询在1秒钟内运行:
SELECT P.idProduct, P.sku, P.description, P.price, P.listhidden, P.listprice, P.serviceSpec, P.bToBPrice, P.smallImageUrl,P.noprices,P.stock, P.noStock,P.pcprod_HideBTOPrice,P.pcProd_BackOrder,P.FormQuantity,P.pcProd_BTODefaultPrice,cast(P.sDesc as varchar(8000)) sDesc, 0, 0, P.pcprod_OrdInHome, P.sales, P.pcprod_EnteredOn, P.hotdeal, P.pcProd_SkipDetailsPage
FROM products P INNER JOIN categories_products CP ON P.idProduct = CP.idProduct
WHERE CP.idCategory=494 AND active=-1 AND configOnly=0 and removed=0 AND formQuantity=0
AND ((SELECT TOP 1 SP.stock FROM products SP WHERE SP.pcprod_ParentPrd = P.idProduct AND SP.description LIKE N'%(9-12 Months)' AND SP.removed=0) > 0)
ORDER BY P.description Asc
第二个运行40秒多,但唯一的区别是idCategory
查询:
SELECT P.idProduct, P.sku, P.description, P.price, P.listhidden, P.listprice, P.serviceSpec, P.bToBPrice, P.smallImageUrl,P.noprices,P.stock, P.noStock,P.pcprod_HideBTOPrice,P.pcProd_BackOrder,P.FormQuantity,P.pcProd_BTODefaultPrice,cast(P.sDesc as varchar(8000)) sDesc, 0, 0, P.pcprod_OrdInHome, P.sales, P.pcprod_EnteredOn, P.hotdeal, P.pcProd_SkipDetailsPage
FROM products P INNER JOIN categories_products CP ON P.idProduct = CP.idProduct
WHERE CP.idCategory=628 AND active=-1 AND configOnly=0 and removed=0 AND formQuantity=0
AND ((SELECT TOP 1 SP.stock FROM products SP WHERE SP.pcprod_ParentPrd = P.idProduct AND SP.description LIKE N'%(9-12 Months)' AND SP.removed=0) > 0)
ORDER BY P.description Asc
他们甚至返回完全相同的记录完全相同的顺序。
[编辑]这里的计划是实际,而不是估计,执行计划。
categories_products
表是一个简单的查找表,只有两个字段idCategory
和idProduct
。即使是返回的记录也完全一样(只是碰巧SP.description LIKE N'%(9-12 Months)'
,同样的产品被分配到这两个类别)。两者之间唯一的另一个区别是CP.idCategory
628是在今天早上刚刚创建的(但我没有看到可能会产生什么差异)。 [编辑:但是这正是没赚差价]
怎么能这样呢?如何简单地改变这里查询的CP.idCategory
会产生一个不同的执行计划,更重要的是:它是如何执行40倍的执行时间?
最终,我不知所措弄清楚如何改善因为有两个,我可以理解没有本质区别,第二查询的可怕表现。
因此,如果你悬停ov呃两种情况下的_products_表扫描,它在搜索什么?如果你运行这个并包含_actual_计划,你是否看到实际和估计行数有差异? –
也可能是第二个查询有一个错误的缓存计划,第一个查询没有。 –
当大量的行被添加或修改时,我偶尔会看到类似的行为。通常它帮助我手动刷新涉及表的统计信息。但执行计划(针对慢速查询)明确指出缺少索引。尝试创建它,看看会发生什么... – user1429080