A cursor is a memory resident set of pointers -- meaning it
occupies memory from your system that may be available for other processes. Microsoft SQL Server implements
cursors by creating a temporary table and populating it with the query's result
set. If a cursor is not properly closed (deallocated), the resources
will not be freed until the SQL session (connection) itself is closed. This
wasting of resources on the server can lead to performance degradations and
failures.
The types of cursors
used are very important in terms of performance.
1.
FORWARD_ONLY - Specifies that the cursor can only be scrolled from the first to
the last row. FETCH NEXT is the only supported fetch option. If FORWARD_ONLY is
specified without the STATIC, KEYSET, or DYNAMIC keywords, the cursor operates
as a DYNAMIC cursor.
2.
STATIC - Defines
a cursor that makes a temporary copy of the data to be used by the cursor. All
requests to the cursor are answered from this temporary table in tempdb;
therefore, modifications made to base tables are not reflected in the data
returned by fetches made to this cursor.
3.
READ_ONLY - Prevents
updates made through this cursor. The cursor cannot be referenced in a WHERE
CURRENT OF clause in an UPDATE or DELETE statement. This option overrides the
default capability of a cursor to be updated.
4.
FAST_FORWARD - Specifies a FORWARD_ONLY, READ_ONLY cursor with performance
optimizations enabled. FAST_FORWARD cannot be specified if SCROLL or FOR_UPDATE
is also specified.
Cursors can be faster than a while loop but they do have more
overhead. If your cursor will not be updating the base tables, use a
FAST_FORWARD cursor for optimal performance.
Disadvantages
Disadvantages
1.
Fetching a row from the
cursor may result in a network round trip each
time. This uses much more network bandwidth than would ordinarily be needed for
the execution of a single SQL statement like DELETE. Repeated network round
trips can severely impact the speed of the operation using the cursor.
2.
Also, a majority of
cursor operations occur in tempdb, so a heavily used tempdb will be even more
overloaded with the use of cursors.
No comments:
Post a Comment