我有一张包含很多行的表格。它被编入索引。我经常做的其中一项操作是从该表中选择一个随机记录。为此,我使用以下SQL语句:
SELECT TOP 1 *
FROM
( SELECT TOP (@RecNo) * FROM Table ORDER BY Date ASC ) AS subquery1
ORDER BY
Date DESC ;
其中@RecNo是随机数。查询花费了大量的时间来运行。有什么想法可以在这里优化吗?
答案 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