Using SQL 2005 / 2008
I have to use a forward cursor, but I don't want to suffer poor performance. Is there a faster way I can loop without using cursors?
Using SQL 2005 / 2008
I have to use a forward cursor, but I don't want to suffer poor performance. Is there a faster way I can loop without using cursors?
Recursive Queries using Common Table Expressions.
It is not accurate to say "Cursors affect performance of SQL". They certainly have a tendency to, but a lot of that has to do with how people use them.
First option is to try to find a set-based approach to the problem.
If logically there is no set-based approach, and the query for the Cursor is hitting real (non-Temp) Tables, then use the STATIC keyword which will put the results of the SELECT statement into a Temp Table and hence will not lock the base-tables of the query as you iterate through the results. Using STATIC will not help if you need to be sensitive of records that might disappear while processing the result set, but that is a moot point if you are considering converting to a WHILE loop against a Temp Table (since that will also not know of changes to underlying data).
Depending on what you want it for, you may be able to use a tally table.
Jeff Moden has an excellent article on tally tables Here
This depends on what you do with the cursor.
Almost everything can be rewritten using set-based operations in which case the loops are performed inside the query plan and since they involve no context switch are much faster.
However, there are some things
SQL Server
is just not good at, like computing cumulative values or joining on date ranges.These kinds of queries can be made faster using a
CURSOR
:But again, this is a quite a rare exception, and normally a set-based way performs better.
If you posted your query, we could probably optimize it and get rid of a
CURSOR
.You can do a
WHILE
loop, however you should seek to achieve a more set based operation as anything in SQL that is iterative is subject to performance issues.http://msdn.microsoft.com/en-us/library/ms178642.aspx
Here is the example using cursor:
Now here is the example how can we get same result without using cursor: