Sql server 需要优化:选择具有特定编号的记录

Sql server 需要优化:选择具有特定编号的记录,sql-server,Sql Server,我有一张有很多行的桌子。它被编入索引。我经常做的一个操作是从这个表中选择一个随机记录。为此,我使用以下SQL语句: SELECT TOP 1 * FROM ( SELECT TOP (@RecNo) * FROM Table ORDER BY Date ASC ) AS subquery1 ORDER BY Date DESC ; 其中@RecNo是随机数。查询需要花费令人烦恼的大量时间来运行。你知道这里可以优化什么吗?试着按集群主键排序。 或者在您的ORDER BY子

我有一张有很多行的桌子。它被编入索引。我经常做的一个操作是从这个表中选择一个随机记录。为此,我使用以下SQL语句:

SELECT TOP 1 * 
FROM 
    ( SELECT TOP (@RecNo) * FROM Table ORDER BY Date ASC ) AS subquery1 
ORDER BY 
    Date DESC ;

其中@RecNo是随机数。查询需要花费令人烦恼的大量时间来运行。你知道这里可以优化什么吗?

试着按集群主键排序。
或者在您的
ORDER BY
子句中包含集群主键。

您真正想要实现的是什么?我想你只想得到一个随机的行。最简单的方法是

 SELECT TOP 1 * FROM Table ORDER BY newid()

由于您使用的是SQL 2005,请尝试使用ROW_NUMBER()函数:

基本上是这样的:

SELECT * FROM Table WHERE (ROW_NUMBER() OVER Date ASC) = @RecNo
您可能需要使用子查询或CTE来使用谓词中的
行号()

我不知道这是否会比
NEWID()
方法更快。这取决于SQL在找到它要查找的值时是否会使
行\u NUMBER()
操作短路。最坏的情况是,它会为每一行生成一个
行\编号()
,最好的情况是,它会在找到该行(可能是第一行..)后立即停止


也有可能为每一行生成
行号()
比生成GUID或对整个表进行排序要快得多。

您对该表有多大的控制权

你能介绍一个新的“row_id”列吗?然后在新列上建立索引,只需执行以下操作:

SELECT * FROM Table WHERE row_id = @RecNo

很抱歉,我在发布答案后也试过了。我已经更改了答案,您可以再次检查。您是否使用SQL 2005或更新版本?这是因为在它返回第一行之前,它必须先为每行生成一个GUID,并找到值最低的GUID。一定有办法做到这一点,这件事让我抓狂!Date实际上是一个主要的聚集键是的,我有控制权,但是添加一列是不够的,在这个列上还必须有一个索引,这将涉及到所有的垃圾,在一个巨大的表上有一个额外的索引。这是一个很好的主意,我今晚晚些时候会尝试,看看它是否有效。即使没有,也很好的想法,谢谢!不。。。不起作用。WHERE子句中不允许使用第一行编号(),因此我需要进行子查询,如
SELECT*FROM(SELECT*,ROW\u NUMBER()…AS dd)AS xx,其中xx.dd=@RandID
。速度增加不存在:(