Sql server SQL Server不会为查询选择最佳索引
我正在尝试优化从COTS应用程序创建的SQL Server查询。因此,我无法更改生成的SQL查询,必须完全依赖SQL Server查询优化器 生成的查询如下所示(很抱歉SQL出错。它是由应用程序生成的,我无法影响它): 执行此查询需要9秒 我用以下语句创建了一个新索引:Sql server SQL Server不会为查询选择最佳索引,sql-server,sql-server-2008,Sql Server,Sql Server 2008,我正在尝试优化从COTS应用程序创建的SQL Server查询。因此,我无法更改生成的SQL查询,必须完全依赖SQL Server查询优化器 生成的查询如下所示(很抱歉SQL出错。它是由应用程序生成的,我无法影响它): 执行此查询需要9秒 我用以下语句创建了一个新索引: CREATE NONCLUSTERED INDEX [AC_ItemId] ON [dbo].[PAC4_DESIGNSOLREVISION] ( [pac4_itemId] ASC )
CREATE NONCLUSTERED INDEX [AC_ItemId] ON [dbo].[PAC4_DESIGNSOLREVISION]
(
[pac4_itemId] ASC
)
INCLUDE ( [puid]) WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, SORT_IN_TEMPDB = OFF, IGNORE_DUP_KEY = OFF, DROP_EXISTING = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
GO
之后,我测试了相同的查询,优化器没有选择索引。它更喜欢聚集索引。查询仍然需要9秒才能完成
然后,我使用“with(index(AC_ItemId))”提示查询使用我的新索引:
通过此添加,执行查询需要0秒
当从COTS应用程序运行查询时,如果我无法更改生成的查询,如何告诉SQL server优化器选择此索引
更新1:
如果我独立运行子SQL语句,优化器将选择非聚集索引。当子SQL放在完整SQL语句的上下文中时,就会出现问题
这是所指的子SQL:
SELECT t_03.puid
FROM PAC4_DESIGNSOLREVISION t_03
WHERE UPPER(t_03.pac4_itemId) LIKE UPPER('%0000%')
添加一个包含引用的所有或大部分字段的复合索引,直到优化器决定使用哪个索引。如果从
UPPER(t\u 03.pac4\u itemId)
中删除UPPER调用,我很好奇原始查询的速度有多快,没有索引提示。@hatchet我试图删除上面的函数,但没有更改。AC_ItemId index在index中有pac4_ItemId列,它包括puid列。这些都是从PAC4_DESIGNSOLREVISION中引用的列。我还尝试将pac4_itemId和puid放在一个综合索引中,但这并没有影响结果。我理解正确了吗?我刚刚重读了这个查询,看起来你确实有所有的字段。可能是将pac4_ItemId包含到puid索引中会让它找到它。我注意到修改后的查询还包含提示:with(index(AC_RevId)),我假设它也被添加了。它在没有提示的情况下正确地选择了这个索引吗?不,这就是问题所在。没有提示,它不会选择我的索引。问题是我如何管理SQL server在不暗示的情况下选择最佳索引。我照你说的做了。我删除了仅在puid上的聚集索引。然后,我用puid和ac4_itemId列创建了一个新的聚集索引。查询现在运行得很快,太好了。你有可能接受我的回答吗?
SELECT DISTINCT t_02.puid, t_02.pac4_itemId FROM PWORKSPACEOBJECT t_01 , PAC4_DESIGNSOLREVISION t_02 WHERE ( ( ( ( t_01.pactive_seq != 0 ) AND ( t_01.pdate_released > CONVERT(datetime, '2011-12-31 23:00:00', 120) ) ) AND t_02.puid IN ( ( ( ( SELECT t_03.puid FROM PAC4_DESIGNSOLREVISION t_03 **with (index(AC_ItemId))** WHERE UPPER(t_03.pac4_itemId) LIKE UPPER( '%0000%' )
UNION ALL
SELECT t_05.puid FROM PWORKSPACEOBJECT t_04 , PAC4_DESIGNSOLREVISION t_05 WHERE ( UPPER(t_04.pobject_name) LIKE UPPER( '%0000%' ) AND ( t_04.puid = t_05.puid ) ) )
UNION ALL
SELECT t_06.puid FROM PAC4_DESIGNSOLREVISION t_06 , PITEMREVISION t_07 with (index(AC_RevId)) WHERE ( UPPER(t_07.pitem_revision_id) LIKE UPPER( '%0000%' ) AND ( t_06.puid = t_07.puid ) ) )
UNION ALL
SELECT t_09.puid FROM PWORKSPACEOBJECT t_08 , PAC4_DESIGNSOLREVISION t_09 WHERE ( UPPER(t_08.pobject_type) LIKE UPPER( '%0000%' ) AND ( t_08.puid = t_09.puid ) ) ) ) ) AND ( t_01.puid = t_02.puid ) )
SELECT t_03.puid
FROM PAC4_DESIGNSOLREVISION t_03
WHERE UPPER(t_03.pac4_itemId) LIKE UPPER('%0000%')