我有以下查询:( 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
答案 0 :(得分:1)
当您select top n without sort
(ORDER BY)
,mssql
只获得n个第一个记录(行)正确的密码(WHERE
)。因此,mssql
无需扫描所有记录
对比度,select top with sort
,mssql
扫描所有记录,获取记录正确条件,然后对列进行排序并获得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