我遇到了一個問題,我無法理解。我們正在運行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