避免在查询中使用“SELECT TOP 1”和“ORDER BY”

时间:2012-10-25 16:23:12

标签: sql sql-server database sql-server-2008

我在sql server 2008中拥有大量数据的表

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

超过18,000条记录。所以我需要具有最小值Column_1的行,即日期,但可以通过任何数据类型(未分类),所以我使用这些句子

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

但这非常慢。我认为我不需要整理整个表格。我的问题是如何在不使用TOP 1ORDER BY

的情况下获得相同的约会

2 个答案:

答案 0 :(得分: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

答案 1 :(得分:2)

这会更快吗?当我读到这个问题时,这就是我想到的代码:

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