在我的應用程序中,我有產品和類別。一個產品可以有多個類別。所以我有兩個表: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)
如果我使用查詢優化器它告訴我查詢使用兩個索引。但是我看到一些我不明白的東西:
它警告我沒有實體類型和predecessorguid的列統計信息。難道是因爲我剛添加了索引?
CwObjects
表的實際讀數和估計的行讀數有很大的差異。
如果我看實況查詢統計查詢讀取171K記錄CwObjects
與索引查找(爲什麼求?)。然後在EntityObjectLink
表中讀取2.5K記錄,然後進行合併連接。反過來這樣做會更有效率。
我真的,真的卡在這裏......任何人都可以幫忙嗎?
下面是執行計劃:https://1drv.ms/u/s!AlCbN2sexrJ-hNJjeSR9cZPOEpOHww
UPDATE:
AtoStats爲ON,幾個小時了。
幾乎所有的時間在指數尋求CwObject消耗...
更新2:
我被迫在統計上cwObjects
表更新。這造成了巨大的差異!查詢速度快了近10倍!
它可能會改善一點(或很多)的複合索引('EntityObjectLink_LinkedCwEntity_Guid,CwObject_CwSiteCluster_Guid'),另一個'CwObject_Name'試試。 –
請發佈執行計劃 – TheGameiswar
您是否曾嘗試在第一個鍵列之後將CwObject_Guid添加到CwObject的聚簇索引? –