【发布时间】:2018-02-27 21:54:59
【问题描述】:
我被难住了。如果我删除查询未使用的索引,则查询将从 46 秒缩短到 6 秒。
这里是查询:
SELECT TOP (10)
[Extent1].[alarm_class_id] AS [alarm_class_id],
[Extent2].[domain_id] AS [domain_id],
[Extent3].[description] AS [description],
[Extent1].[list_id] AS [list_id],
[Extent2].[list_source] AS [list_source],
[Extent1].[list_detail_id] AS [list_detail_id],
[Extent1].[plate] AS [plate],
[Extent1].[notes] AS [notes],
[Extent1].[locale_id] AS [locale_id],
[Extent1].[end_date] AS [end_date],
[Extent2].[eoc_list_id] AS [eoc_list_id],
[Extent2].[list_type_id] AS [list_type_id]
FROM [dbo].[list] AS [Extent2]
INNER JOIN [dbo].[ron_list_detail] AS [Extent1] ON [Extent1].[list_id] = [Extent2].[list_id]
INNER JOIN [dbo].[domain_lookup] AS [Extent3] ON [Extent2].[domain_id] = [Extent3].[domain_id]
WHERE ([Extent2].[domain_id] IN (7)) AND (([Extent1].[end_date] IS NULL) OR ([Extent1].[end_date] > (SysDateTimeOffset())))
这是索引:
CREATE NONCLUSTERED INDEX [ron_CI_list_detail-list_id-plate]
ON [dbo].[ron_list_detail] ([list_id] ASC, [plate] ASC)
WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF,
SORT_IN_TEMPDB = OFF, DROP_EXISTING = OFF, ONLINE = OFF,
ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON, FILLFACTOR = 90) ON [PRIMARY]
GO
附加信息:除非我提供提示,否则查询计划不会使用此索引。如果我提供提示,查询将在一秒钟内完成。
我很困惑 - 想法? (会显示查询计划,但我不知道如何粘贴图像)
【问题讨论】:
-
我能想到神秘的原因。例如,由于有了索引,可以获得额外的统计信息。然而,这些信息会导致错误的查询计划。
-
我只能说,“它发生了”。我有一个特定的查询,我必须在其中包含一个提示,因为如果我不这样做,它的运行速度会慢 100 倍。除非我删除了专门为加速特定查询而设计的索引。计划优化器从不自己选择查询,它的存在似乎使它使用了一个可怕的计划。不知道为什么。这只是一次又一次的情况。我认为 999 次中的一个,它本身不起作用,需要手持。唯一的解决方法是包含提示。
-
如果创建没有 [Plate] 的索引会发生什么情况,如下所示: CREATE NONCLUSTERED INDEX [idx_Test] ON [dbo].[ron_list_detail] ( [list_id] ASC )
-
@pmbAustin - 你在向 T 描述我的情况
-
@MJH - 感谢您的想法。我试过了,但没有运气。我很感激这个想法!
标签: sql sql-server performance indexing