2016-05-05 227 views
1

爲什麼這個查詢需要12秒,並且它完美地包含索引。SQL查詢優化加快SELECT DISTINCT

SELECT DISTINCT TOP 5000 -- Search For User has currently associated with given Email Address 
    u.i_UserID, 
    u.vch_LoginName, 
    ea.vch_EmailAddress, 
    u.vch_DisplayName, 
    CAST(GETDATE()as smalldatetime) AS 'd_DateAdded', 
    'Current' AS 'vch_RecordStatus' 
FROM 
    tblUser AS u --WITH (NOLOCK) 
JOIN 
    [User].dbo.tblEmailAddress AS ea --WITH (NOLOCK)        
     ON u.i_EmailAddressID = ea.i_EmailAddressID 
WHERE 
    ea.vch_EmailAddress LIKE '%kala%' OPTION (RECOMPILE) 
+1

如果你看看查詢計劃,你很可能會看到聚簇索引掃描 - 並且這應該告訴你完美的索引沒有被使用。 –

+1

我知道你有他們的評論,但你應該忘記使用NOLOCK作爲性能的助推器。它可以提高性能,但它帶來了很多包袱。 http://blogs.sqlsentry.com/aaronbertrand/bad-habits-nolock-everywhere/你也有頂5000,但沒有秩序。這意味着你不會總是獲得相同的5000行。 –

+0

vch_EmailAddress上的篩選器有多選擇性? IE,平均返回多少行,總共有多少行存在於tblEmailAddress表中? – dean

回答

2

當Where子句包含像你這樣的Like語句時,SQL Server不會(不能)使用索引。必須完成掃描。這是因爲你已經告訴SQL Server你需要vch_EmailAddress在郵件地址的任何地方包含'kala'的所有行。因此,正常的索引不會被使用。它必須掃描每一行並評估每個電子郵件地址。

如果您要將Where子句更改爲這樣的內容,可能會(可能)使用索引。

where ea.vch_EmailAddress Like 'kala%' OPTION (RECOMPILE) 
+0

是的,你寫了...它需要2秒...要求是字符串contains.contains在這個意義上,我們必須這樣給%kala% –

+0

如果這是要求,那麼你可以做的事情不多。表掃描或索引掃描將是必需的。 –

+0

我們如何做索引掃描...如果可能,可以簡要解釋 –