2012-10-25 56 views
4

我有很表中的SQL Server 2008與大量數據避免 「SELECT TOP 1」 和 「ORDER BY」,在查詢

|ID|Name|Column_1|Column_2| 
|..|....|........|........| 

超過18000條記錄以上。所以我需要在該行與Column_1最低值是日期,但可以通過任何數據類型(即未排序的),所以我用這些句子

SELECT TOP 1 ID, Name from table ORDER BY Column_1 ASC 

但是,這是非常非常慢。我認爲我不需要整理整個桌子。我的問題如何得到相同的日期與使用TOP 1ORDER BY

+1

什麼數據類型是Column_1?你在Column_1上有索引嗎? – alexn

+6

我認爲你沒有'Column_1'上的索引?如果你打算經常使用它,那麼我會首先考慮做 – freefaller

+1

你是否在列上嘗試了'MIN()'?取決於數據類型,這可能工作 – Taryn

回答

8

我不明白爲什麼18,000行的信息會導致太多的減速,但很明顯,沒有看到你正在存儲的數據是什麼。

如果您經常要使用Column_1字段,那麼我建議您在其上放置一個非聚集索引...這將加快您的查詢速度。

您可以通過 「設計」 通過SQL Server Management Studio中的表格,或通過直接TSQL做...

CREATE INDEX IX_myTable_Column_1 ON myTable (Column_1 ASC) 

更多信息MSDN about creating indexes here


更新感謝@GarethD的評論幫助了我,因爲我實際上並沒有意識到這一點。

由於上述TSQL語句的額外的一部分,它會增加你查詢的速度,如果你包括將在索引中使用的其他列的名稱....

CREATE INDEX IX_myTable_Column_1 ON myTable (Column_1 ASC) INCLUDE (ID, Name) 

由於GarethD指出,using this SQLFiddle as proof,執行計劃要快得多,因爲它避免了「RID」(或行標識符)查找。在MSDN about creating indexes with include columns here

更多信息,謝謝@GarethD

+0

我同意前提,但你答案建議聚集索引,但你的SQL會創建一個非聚集索引(這是我認爲會工作,因爲我想象列'ID'是聚集索引的PK)。所以這可能應該被清除,我不確定究竟是什麼意思,所以不想破壞你的工作。也許值得在索引中包含'Name'作爲非關鍵列(基於問題中的查詢) – GarethD

+0

Ack,你說得對不起眼的@GarethD ...打字太快了,不利於我自己的工作。我已經相應編輯了。不知道是否需要包含'Name'雖然 – freefaller

+0

SOrry應該說ID和名稱,我認爲不需要在非關鍵列中包含主鍵。如果您在[This Fiddle](http://www.sqlfiddle.com/#!3/a412b/1)中檢查執行計劃,則會看到第二個查詢(包含在索引中的非關鍵列)避免了擺脫查找所以將不可避免地表現更好(無論如何選擇)。 – GarethD

2

將這工作得更快?當我讀到這個問題時,這是想到的代碼:

Select top 1 ID, Name 
from table 
where Column_1 = (Select min(Column_1) from table) 
+1

這將返回多行,如果兩個'Column_1'具有相同的值,是最低....,即使如此,我wouldn預計它運行得更快。 – Matthew

+0

我很確定,即使在多個最小值的情況下,從表中選擇min(Column_1)也會返回1行。即使它沒有,「top 1」子句仍然保證只返回1行。但是,我不知道它會不會跑得更快。 – PowerUser