Sql server 需要优化:选择具有特定编号的记录
我有一张有很多行的桌子。它被编入索引。我经常做的一个操作是从这个表中选择一个随机记录。为此,我使用以下SQL语句: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子
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
。速度增加不存在:(