2016-12-06 57 views
1

时,如果我有表Mission查询需要永远:为什么用下面的结构改变价值

emp_num    int    P.K 
from_date   datetime  P.K 
to_date    datetime  P.K 
mission_location  varchar(200) 
mission_desc   varchar(200) 
req_ser    int    P.K 
req_year    int    P.K 

CONSTRAINT [pkc_mission] PRIMARY KEY CLUSTERED 
(
    [emp_num] ASC, 
    [from_date] ASC, 
    [to_date] ASC, 
    [ req_ser] ASC, 
    [ req_year] ASC 
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] 
) ON [PRIMARY] 

当我尝试运行此查询:

select * 
from mission where emp_num =5307 

它的工作速度非常快,但是当我尝试运行相同的q用另一种价值观念,它需要永远!

select * 
from mission where emp_num =4595 
+2

检查执行计划可能是参数嗅探。第二个查询可能仍然使用旧的执行计划。尝试运行这个'select * from emp_num = 4595选项(RECOMPILE);' –

+0

可能你运行了第一个查询并且结果存在于缓存中(而新的查询不存在)。 – Dekel

+1

也许workers 4595在表中有数十亿行,而员工5307只有一个。 –

回答

1

请试试这个 -

select * 
from mission with (forceseek) 
where emp_num = 4595 
+0

为什么'with(forceseek)'? –

+0

首先让我们看看索引的使用是否提高了性能。如果是这样,我们可以继续调查为什么索引没有被使用。 –

+0

只有当我知道我的统计信息是最新的 –