2013-03-21 37 views
4

好我是新來這個東西..我已經在我的SP在啓動時創建的索引類似如下如何在SQL查詢中使用索引

Create Index index_fab 
ON TblFab (Fab_name) 

現在我有根據本

select fab_name from TblFab where artc = 'x' and atelr = 'y'. 
查詢

現在是否有必要在SELECT子句中使用這個索引的名字,否則將自動用於加快查詢

我一定要使用像

select fab_name from TblFab WITH(INDEX(index_fab)) where artc = 'x' and atelr = 'y'. 

或使用該指數查詢

,以及如何,如果我們使用的是加入此表上使用索引任何其他方法?

回答

7

首先,你的意思是你在存儲過程中創建索引?這是一個壞主意 - 如果你運行存儲過程兩次,它會失敗,因爲索引已經存在。

其次,您的查詢不使用索引中提到的列,所以它不會有任何影響。

第三,正如JodyT寫的,查詢分析器(SQL Server本身)將決定使用哪個索引;它幾乎肯定比你更好。

最後,爲了加快您提到的查詢,請在artc和atelr列上創建索引。

3

SQL Server的查詢優化器將決定索引是否適合查詢。你不能force它使用一個特定的索引。您可以提供您希望使用的提示,但不能保證它會使用它。

1

如果索引設置正確,優化器將自動使用它。通過適當的設置,我的意思是它有足夠的選擇性,可以有效地幫助查詢等。閱讀它。您可以通過使用ssms中的「包含實際執行計劃」選項自行檢查是否正在使用索引。 一般不建議使用(index())提示,並讓優化器自行決定,除非你知道更好的情況非常特殊的情況除外)。

2

如果您使用它對錶進行查詢,則應該默認使用索引。 但我認爲在您發佈的查詢中,它不會被使用,因爲您沒有按照您創建索引的列來過濾數據。 我認爲你必須爲artc和atelr列創建索引才能從中獲利。 要查看是否使用了您的索引,請查看SQL Management Studio中使用的執行計劃。在指數

更多信息:use the index luke

2

你不需要在您的查詢索引。它由sql server管理。如果你想加入到這張表中,你也不需要在select中包含索引。希望它清楚。

2

你是索引使用「Fab_name」列,你不在篩選語句中過濾,所以它是沒有用的。

既然你是新來這個,你可能會從索引中受益這樣的:

Create Index index_fab 
ON TblFab (artc, atelr) 

也許這樣

Create Index index_fab 
ON TblFab (atelr, artc) 

...是有很多細微之處來學習。

2

爲獲得更佳性能: 列出經常使用的列/表, 僅在這些表/列上創建索引。

2

正如其他人回答你的問題,以幫助你更好地理解,我的意見是,你應該首先明白你爲什麼需要使用索引。我們知道索引會提高性能,但也會導致性能問題。它更好地知道何時需要使用索引,爲什麼需要使用索引而不是如何使用索引。

您可以從here幾乎讀取每個小細節。

關於你的例子,你的查詢的索引沒有影響。因爲它在查詢的where子句中沒有提到的列。

你還可以嘗試:

CREATE INDEX yourIndexName ON yourTableName (column_you_are_looking_for1,column_you_are_lookingfor2

還不錯知道:如果在表上不存在索引,必須在數據庫查詢中引用的每個表執行表掃描。表格越大,表格掃描所需時間就越長,因爲表格掃描需要按順序訪問每個表格行。雖然對於需要表中大部分行的複雜查詢,表掃描可能更有效,但對於只返回某些錶行的查詢,索引掃描可以更有效地訪問錶行。 (來自here

希望這會有所幫助。

+0

對不起,前英文老師在這裏。第二段中的「每個小細節」都應該寫成「每一個小細節」。名詞前置修飾語「every」是指其具有名詞的單數形式,因此「細節」在其複數形式中是無效的。 HTH – 2014-10-10 13:51:06

+0

@Jason如果這是你能找到的一位前英語老師唯一的錯誤,那麼我真的很高興ESL的演講者/作家:D – curiousBoy 2015-12-10 17:56:11