2011-06-01 112 views
3

你好
我有一張有很多記錄(1100萬)的表格。記錄有一個外部ID,日期和一些其他字段。
我有一個查詢,我經常在我的應用程序中運行。查詢是這樣的:
包含非聚集索引的列


if(SELECT * FROM myTable WHERE [email protected] AND [email protected] != 0)  
    UPDATE myTable SET ....... WHERE [email protected] AND [email protected] 
else 
    INSERT INTO myTable(......) VALUES(.....) 

我想「日期」添加爲一個非聚集索引。那麼如果我將「ForeignID」列添加爲該索引的包含列,是否會幫助查詢更快地執行?
謝謝。

回答

3

我同意@gbn指出您需要Date和ForeignID索引而不是「包含列」。

如下,您可以創建它:

CREATE NONCLUSTERED INDEX [IDX1] ON [myTable] ([Date], [ForeignID]) 

但是「SELECT *」是不是來檢查記錄是否存在一個很好的方式。你可以使用「EXISTS」子句

1

添加ForeignID將有所幫助,因爲索引將覆蓋子查詢,並且它不需要從表中獲取ForeignID

但是,最好爲DateForeignID添加唯一約束或索引。

像這樣:

create unique index IX_MyTable_Date_ForeignID on MyTable(Date, ForeignID) 

此外,您可能需要使用MERGE語句這種查詢。取決於你使用的SQL版本。

+0

我同時使用Sql Server 2005/2008。我會尋找MERGE謝謝。您認爲分別爲Date和ForeignID添加非聚簇索引更好? – Fer 2011-06-01 08:43:44

+0

@Fer - 不分開,兩個字段的索引。更新了答案。 – 2011-06-01 08:50:30

0

是的,我希望它顯著加快此查詢(你需要做一個選擇*?)

但它會插入放慢到表中,因爲它有另一個指標來寫 - 這將明顯增加數據庫的大小。

這可能值得添加,如果這經常運行PROC非常慢。

+0

我想我也必須添加。但我正在尋找添加索引的最佳方式。順便說一句,我需要選擇測試現有的記錄,但我可以使用任何其他方法來做到這一點。 – Fer 2011-06-01 08:47:34

1

在Date和ForeignID上都需要一個索引,Date爲first。它是一個過濾器(在WHERE子句中),所以它應該在關鍵列而不是INCLUDE列

此外,您的模式test..update..else..insert不可伸縮。請參閱this以瞭解其他方式:Select/Insert version of an Upsert: is there a design pattern for high concurrency?

+0

我應該添加Date和ForeignID seperatly作爲索引?我將搜索更好的模式來檢查更新插入。 Thnks。 – Fer 2011-06-01 08:46:27

+0

@Fer:no,兩列的複合索引。 (更新:按照Hasan的回答) – gbn 2011-06-01 08:59:32