需要优化:选择具有特定号码的记录

时间:2009-04-18 06:39:19

标签: sql-server

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

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

其中@RecNo是随机数。查询花费了大量的时间来运行。有什么想法可以在这里优化吗?

4 个答案:

答案 0 :(得分:1)

尝试通过群集主键对其进行排序。 或者在ORDER BY子句中包含群集主键。

答案 1 :(得分:1)

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

http://msdn.microsoft.com/en-us/library/ms186734.aspx

基本上类似于:

SELECT * FROM Table WHERE (ROW_NUMBER() OVER Date ASC) = @RecNo

您可能需要使用子查询或CTE来使用谓词中的ROW_NUMBER()值。

我不知道这是否会比NEWID()方法更快。取决于SQL在找到它正在查找的值时是否会使ROW_NUMBER()操作短路。最坏的情况是它会为每一行产生ROW_NUMBER(),最好的情况是它会在找到行时停止(可以是第一行......)。

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

答案 2 :(得分:0)

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

 SELECT TOP 1 * FROM Table ORDER BY newid()

答案 3 :(得分:0)

你对桌子有多少控制权?

你能介绍一个新的“row_id”专栏吗?然后索引新列,只需执行:

SELECT * FROM Table WHERE row_id = @RecNo