包含查询 - 超时已到期

时间:2015-12-08 07:39:08

标签: sql-server

我有以下查询:( tweetentity表有大约100,000条记录)

 select top 1 * from tweetentity  WHERE contains( HashTag , '%23%d8%a7%d9%84%d8%b3%d8%b9%d8%a7%d8%af%d9%87_%d8%a7%d8%b4%d9%88%d9%81%d9%87%d8%a7')  

在不到一秒的时间内运行。 (查询共有86条记录)。但是当我运行这个查询时,

select top 1 * from tweetentity  WHERE contains( HashTag , '%23%d8%a7%d9%84%d8%b3%d8%b9%d8%a7%d8%af%d9%87_%d8%a7%d8%b4%d9%88%d9%81%d9%87%d8%a7')  ORDER by FavoriteCount DESC, LastModifiedDatetime desc 

它超时。

我有这个表的以下索引,但时间用完了。

 CREATE NONCLUSTERED INDEX [IX_TweetEntity_FavoriteCount1] ON [dbo].[TweetEntity] 
 (
[FavoriteCount] DESC,
[LastModifiedDateTime] DESC
 )WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, SORT_IN_TEMPDB = OFF, IGNORE_DUP_KEY = OFF, DROP_EXISTING = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]

GO

1 个答案:

答案 0 :(得分:1)

当您select top n without sortORDER BY)mssql只获得n个第一个记录(行)正确的密码(WHERE)。因此,mssql无需扫描所有记录

对比度,select top with sortmssql扫描所有记录,获取记录正确条件,然后对列进行排序并获得n列

索引可以帮助您加快扫描速度,加快排序速度。您的索引只是帮助您更快地排序!您可以将where子句中包含的列添加到索引中(注意:使其成为前导键),如下所示:

CREATE INDEX Index_name ON Your_Table
(list columns in where clause, list columns in order by clause)
-- no need get all columns in per clause