【发布时间】:2015-01-13 12:57:47
【问题描述】:
我有一个简单的查询:
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
当我在没有“Where”子句的情况下运行此查询时,需要 0.1 秒。但是添加 where 子句会导致它需要 1 分钟才能返回。所有的表都有相关的索引并且它们已经被去碎片化。三张表的行数为:
BOLTYPE:11 行
BOLMAIN:71,455 行
WORKORDER:197,500 行
以下是执行计划:
没有 Where 子句(0.1 秒):
使用 Where 子句(60 秒):
知道可能是什么问题吗?
更新:以下是相关的索引定义:
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
【问题讨论】:
-
这也需要同样的时间吗?选择 Distinct BOLTYPENAME, BOLTYPE.BOLTYPE From BOLTYPE, WORKORDER, BOLMAIN where WORKORDER.BOLTYPE=BOLTYPE.BOLTYPE AND BOLMAIN.BOLID=WORKORDER.BOLID AND BOLMAIN.CORID=156
-
是的。需要同样的时间。
-
您的索引看起来不正确。你能用他们的定义来编辑吗?
-
请粘贴创建表脚本
-
添加表脚本会太长,因为有几十个其他表和互连外键。我已经发布了相关的索引定义。
标签: sql-server indexing