2016-12-06 172 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

只有當我知道我的統計信息是最新的 –