2016-08-22 97 views
0

我有以下查詢,Select語句的時間太長完成

SELECT 1 
FROM orderdetail    -- table orderdetail has 1420703 rows 
WHERE orderdetailstatusid != 3 -- not cancelled 
AND 
navdate = '20161212'; 

的問題是,它需要以上,130秒因爲它的掃描巨大的表〜1420703行來執行。我想知道是否有辦法讓它更快一點。

我試着在最後做limit 1但這也沒有幫助。

有人可以提出一些建議,如何改進?

預先感謝您。

+2

你有沒有索引在桌子上?添加'explain select ...' –

+0

的輸出謝謝@juergend回覆我的問題,我確實在表格中有索引,但沒有任何帶有orderdetailstatus或navdate的索引。可能是添加新索引的好主意。謝謝!!! – Nia

回答

1

,並增加我的貢獻:

爲了獲得最佳性能:

首先,你應該有你的兩列索引提議MACCO

其次,!=/<>運營商是一個PERF殺手,多少對於引擎而言,操作員的密集度要高於=,並且可能會導致全表掃描。 如果可以,最好列出所有可能的值,而不是說與值不同。 它看起來就是這種情況。所以,你可以重寫查詢是這樣的:

SELECT 1 
FROM orderdetail    -- table orderdetail has 1420703 rows 
WHERE orderdetailstatusid IN (1,2,4,5) -- everything but cancelled 
    AND navdate = '20161212'; 

假設你只能有orderdetailstatusid值一樣(1,2,3,4,5),相應地改變。

+0

嗨托馬斯,感謝您對我的問題的回覆,的確幫助了很多,我使用了'WHERE orderdetailstatusid IN(1,4)',這比以前快得多。非常感謝你的建議。 :) – Nia

2

在表上創建索引會使其更快。

CREATE INDEX index_name1 
ON table_name (navdate) 

CREATE INDEX index_name2 
ON table_name (orderdetailstatusid) 
+1

首先在'navdate'上添加索引,然後在'orderdetailstatusid'上添加索引,如果它適合您的數據,那麼您可以將'navdate'的數據項更改爲INT,現在看起來是CHAR或VARCHAR,因爲字符數據比較比數字慢。 – Susang

+0

謝謝大家迴應我的問題,我會嘗試創建索引,看看它是否得到更快。再次感謝!!!!! :) – Nia

1

SELECT 1

FROM的OrderDetail有(NOLOCK)

WHERE orderdetailstatusid = 3 - 不是取消

AND navdate = '20161212'!;

+0

With(NOLOCK)允許您更快地執行查詢然後您期望它不允許鎖定表格 –

+0

嗨,Alfaiz,感謝您的建議,我一定會試試這個。我不知道'NOLOCK'thingie。謝謝:) – Nia