2016-07-04 76 views
3

在我的應用程序中,我有產品和類別。一個產品可以有多個類別。所以我有兩個表:CwObject(產品)和EntityObjectLink(產品和類別之間的鏈接)。我有一個使用了很多的查詢,但即使經過幾天的tweeking它是非常緩慢。 CwObject中有大約400K條記錄,EntityObjectLink中有1.2M。非常緩慢的查詢內部連接

這是查詢:

SELECT TOP (99999) 
    CwObject.* 
FROM 
    CwObject 
INNER JOIN 
    dbo.EntityObjectLink ON CwObject.CwObject_Guid = EntityObjectLink.EntityObjectLink_LinkedCwObject_Guid 
WHERE 
    EntityObjectLink_LinkedCwEntity_Guid = '9a0e41d7-a472-445e-b94f-44fe1a1506b3' 
    AND CwObject_CwSiteCluster_Guid = '0f178176-9720-41c7-9528-99fdf30005e8' 
    AND CwObject_EntityType = 1 
    AND (CwObject_Predecessor_Guid IS NULL) 
ORDER BY 
    CwObject_Name ASC 

EntityObjectLink有一個相關的聚集索引:

PRIMARY KEY CLUSTERED ([EntityObjectLink_LinkedCwEntity_Guid] ASC, 
         [EntityObjectLink_LinkedCwObject_Guid] ASC) 
     WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, 
      SORT_IN_TEMPDB = OFF, IGNORE_DUP_KEY = OFF, ONLINE = OFF, 
      ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) 

CwObject表有一個相關的索引:

NONCLUSTERED INDEX [IX_ClusterEntitytypePredecessorStatusClusteraccount] 
ON [dbo].[CwObject]([CwObject_CwSiteCluster_Guid] ASC, 
        [CwObject_EntityType] ASC, 
        [CwObject_Predecessor_Guid] ASC, 
        [CwObject_Status] ASC, 
        [CwObject_ClusterAccount_Guid] ASC) 
INCLUDE (% ALL other columns%) 
     WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, 
      SORT_IN_TEMPDB = OFF, DROP_EXISTING = OFF, ONLINE = OFF, 
      ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) 

如果我使用查詢優化器它告訴我查詢使用兩個索引。但是我看到一些我不明白的東西:

  1. 它警告我沒有實體類型和predecessorguid的列統計信息。難道是因爲我剛添加了索引?

  2. CwObjects表的實際讀數和估計的行讀數有很大的差異。

如果我看實況查詢統計查詢讀取171K記錄CwObjects與索引查找(爲什麼求?)。然後在EntityObjectLink表中讀取2.5K記錄,然後進行合併連接。反過來這樣做會更有效率。

我真的,真的卡在這裏......任何人都可以幫忙嗎?

下面是執行計劃:https://1drv.ms/u/s!AlCbN2sexrJ-hNJjeSR9cZPOEpOHww

UPDATE:

AtoStats爲ON,幾個小時了。

幾乎所有的時間在指數尋求CwObject消耗...

更新2:

我被迫在統計上cwObjects表更新。這造成了巨大的差異!查詢速度快了近10倍!

+0

它可能會改善一點(或很多)的複合索引('EntityObjectLink_LinkedCwEntity_Guid,CwObject_CwSiteCluster_Guid'),另一個'CwObject_Name'試試。 –

+0

請發佈執行計劃 – TheGameiswar

+0

您是否曾嘗試在第一個鍵列之後將CwObject_Guid添加到CwObject的聚簇索引? –

回答

4

您不必對某些列的統計,因此你在執行計劃中得到這樣的警告:

鋼柱沒有統計: [compareware] [DBO] [CwObject]。 CwObject_EntityType; [compareware] [DBO]。[CwObject] .CwObject_Predecessor_Guid

這導致174480行的實際數目,而行的估計數爲1779,2。

嘗試激活數據庫上的auto create statistics,或手動在這些列上創建統計信息。

+0

自動創建統計信息已打開。但我不得不手動創建它們。做出了巨大的差異(快10倍)。 –