Нужно оптимизировать: выбрать запись с конкретным номером - PullRequest
0 голосов
/ 18 апреля 2009

У меня есть таблица с большим количеством строк. Индексируется. Одна из операций, которые я обычно выполняю, - это выбор случайной записи из этой таблицы. Для этого я использую следующую инструкцию SQL:

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

Где @RecNo - случайное число. Запрос занимает раздражающе много времени для запуска. Есть идеи, что можно оптимизировать здесь?

Ответы [ 4 ]

1 голос
/ 22 апреля 2009

Поскольку вы работаете в 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 или иная сортировка всей таблицы.

1 голос
/ 18 апреля 2009

Попробуйте упорядочить его по кластерному первичному ключу. Или включите кластерный первичный ключ в ваше предложение ORDER BY.

0 голосов
/ 22 апреля 2009

Какой контроль вы имеете над столом?

Не могли бы вы ввести новый столбец "row_id"? Затем внесите в указатель новый столбец и просто выполните:

SELECT * FROM Table WHERE row_id = @RecNo
0 голосов
/ 18 апреля 2009

Чего вы действительно пытаетесь достичь? Я полагаю, вы просто хотите получить одну случайную строку. Самый простой способ сделать это будет

 SELECT TOP 1 * FROM Table ORDER BY newid()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...