Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/sql-server-2008/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server SQL Server不会为查询选择最佳索引_Sql Server_Sql Server 2008 - Fatal编程技术网

Sql server SQL Server不会为查询选择最佳索引

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 )

我正在尝试优化从COTS应用程序创建的SQL Server查询。因此,我无法更改生成的SQL查询,必须完全依赖SQL Server查询优化器

生成的查询如下所示(很抱歉SQL出错。它是由应用程序生成的,我无法影响它):

执行此查询需要9秒

我用以下语句创建了一个新索引:

    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%')