Как я могу получить «время» быстрее, чем курсор в этом случае? - PullRequest
0 голосов
/ 08 декабря 2011

В настоящее время мне нужно больше работать с SQL Server, и я прочитал о курсорах и о том, как их следует избегать, потому что они используют много ресурсов и потому, что они медленные.

Теперь я попытался сделать некоторые базовые вещи с помощью курсора и попытался восстановить его с помощью цикла while. В конце курсор был в ~ 10 раз быстрее, чем цикл while, а ресурсы были примерно на 60-40%.

Может быть, потому что у меня есть странное примерное упражнение?

Это упражнение, которое я дал себе:

  • Итерация по таблице, в этой таблице ровно один столбец: «Имена», содержащие около 1000 имен.
  • Напечатайте каждое имя отдельно.

С курсором все довольно просто, но для цикла while мне нужен счетчик или что-то вроде этого. Поскольку таблица не имеет индекса, я не могу это использовать. Таким образом, мое решение состояло в том, что я создал временную таблицу, добавил все имена в таблицу и включил индекс (или номер строки). Но операция вставки занимает около 95% времени, и в конце цикл while работает медленнее, чем курсор.

Edit:
Еще я попробовал использовать WITH Names_Rows AS... и добавить Row_Number() в качестве столбца, а затем использовать цикл while для итерации конструкции Names_Rows. Но это заняло еще больше времени.

Я пропустил простой способ перебора таблицы с использованием пока без индекса?

Ответы [ 2 ]

4 голосов
/ 08 декабря 2011

Причина, по которой следует избегать курсоров, заключается в том, что вы выполняете императивные операции по одной строке за раз, а не декларативные операции на основе множеств.

Замена курсора циклом while сама по себе волшебным образом не повышает производительностьвполне может ухудшить производительность, как вы узнали.Разница в производительности между ними будет зависеть от вашего точного кода / структуры таблицы и выбранных вами параметров курсора , как описано в этой серии статей .

Чтобы распечатать все имена из таблицыв более подходящей основе вы могли бы сделать

DECLARE @Names nvarchar(max);

SELECT @Names = ISNULL(@Names + '
','') + Names
FROM YourTable;

PRINT @Names;
0 голосов
/ 08 декабря 2011

Самый простой способ выполнить функцию для каждого значения определенного столбца в таблице:

select MyFunction(ColumnName) from TableName
...