2015-01-13 98 views
4

我有一个简单的查询:当我添加Where子句时会出现什么问题?

Select Distinct BOLTYPENAME, BOLTYPE.BOLTYPE From BOLTYPE 
Inner Join WORKORDER on WORKORDER.BOLTYPE=BOLTYPE.BOLTYPE 
Inner Join BOLMAIN On BOLMAIN.BOLID=WORKORDER.BOLID 
Where BOLMAIN.CORID=156 

当我运行此查询没有“如果”的条款,它需要0.1秒。但添加where子句会导致它需要1分钟才能返回。所有的表都有相关的索引,并且它们已经被拆分。这三个表中的行数是:

BOLTYPE:11行

BOLMAIN:71455行

工单:197500行

下面是执行计划:

Where Where条款(0.1秒):

Without where clause

随着在where子句(60秒):

With Where Clause

任何想法,可能是什么问题?

更新:这里是相关指数的定义:

CREATE NONCLUSTERED INDEX [BOLIDX] ON [dbo].[WORKORDER] 
([BOLID] ASC) 
GO 

CREATE NONCLUSTERED INDEX [CORIDX] ON [dbo].[BOLMAIN] 
([CORID] ASC) 
INCLUDE ([BOLID]) 
GO 

CREATE NONCLUSTERED INDEX [BOLTYPEIDX] ON [dbo].[WORKORDER] 
([BOLTYPE] ASC) 
GO 
+0

这也采取同样的时间? SELECT DISTINCT BOLTYPENAME,BOLTYPE.BOLTYPE从BOLTYPE,工单,BOLMAIN 其中WORKORDER.BOLTYPE = BOLTYPE.BOLTYPE AND BOLMAIN.BOLID = WORKORDER.BOLID AND BOLMAIN.CORID = 156 – Varun

+0

是。它正在采取同一时间。 – navigator

+0

您的索引看起来不正确。你可以编辑他们的定义吗? – Luaan

回答

1

重新创建CORIDX指数,使其覆盖BOLID。您加入BOLID,因此您希望它成为索引的一部分,而不仅仅是包含的列之一。

换句话说:

CREATE NONCLUSTERED INDEX [CORIDX] ON [dbo].[BOLMAIN] 
([CORID] ASC, [BOLID] ASC) 
+0

或者只是创建两个单独的索引。它看起来不像是一个多列索引的好例子。 – Luaan

+1

他已经有两个单独的索引。当没有WHERE子句时,优化器使用PK_BOLMAIN,我打赌它是在BOLID上。所以他在BOLID上有PK_BOLMAIN,在CORID上有CORIDX。我认为一个多列索引将消除表假脱机并加速嵌套循环。 –

+0

令人惊叹!这解决了它!我不知道移动一列成为索引的一部分,而不是将它包括在索引中会产生如此的差异!非常感谢! – navigator