2016-07-04 77 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倍)。 –