在我的应用程序中,我有产品和类别。一个产品可以有多个类别。所以我有两个表: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的聚簇索引? –